【问题标题】:segmentation fault in file handling文件处理中的分段错误
【发布时间】:2014-01-05 15:08:33
【问题描述】:
int main()
{
FILE *f;
f=fopen("words.txt","r");
char wd[10];
string word;
printf("Enter a word to be searched\n");
word=GetString();
while (!feof(f))
{
    fscanf(f,"%s",wd);   
    //printf("%s\n",wd);
    if(strcmp(word,wd)==0)
    {
        printf("Yes\n");
        break;
    }

 }
 fclose(f);
 return 0;
}

如果要搜索的单词存在于文件中,则给出正确答案 - 是,否则,给出分段错误(核心转储)。 请帮忙!!

【问题讨论】:

  • string 是什么,GetString 是做什么的?
  • 没有string 输入C。
  • 你可以忽略它,它应该发挥作用。它通过包含预处理器(在某些课程中使用)来获取字符串。
  • char wd[10]; : 有足够大的吗?

标签: c file-io exception-handling segmentation-fault


【解决方案1】:

第 6 行:字符串单词; C 中没有字符串数据类型。而且, 第 8 行:word = GetString(); 你没有包括功能的定义。假设它返回指向字符串的指针,但无论如何都不会工作,因为第 6 行不会编译。

如果您确定的单词不会超过 9 个字符,请使用:char word[10]。

【讨论】:

  • 函数已经定义且正确,不会超过9。
【解决方案2】:

@gnometorule 是正确的。你阅读的时间比你需要的多。如果你检查你的返回值,你会发现fscanf 可能返回了EOF。只要fscanf 返回预期值,您要做的就是读取文件。由于您正在阅读 1 项,它应该返回 1。如果没有,则有问题。此外,feof 仅在到达文件末尾时才为真。如果出现读取错误怎么办?您可能正在尝试从设置了错误指示符的文件中读取,而 feof 不会检测到。

查看以下代码。它应该让您了解如何处理文件。

/* This is used to determine whether an end-of-file error message should be printed or the word was found. */
int cmp_result;

/* Stop reading when the file can't be read or the words are equal. */
do
    cmp_result = strcmp(word, wd);
while (fscanf(f, "%s", wd) == 1 && cmp_result != 0);

/* Check for a file read error. */
if (ferror(f))
    printf("Error reading file\n");

/* End of file reached before words are equal; feof(f) may be true when cmp_result==0 or not, so checking cmp_result is more reliable in this case. */
else if (cmp_result != 0)
    printf("Word '%s' not found\n", word);

/* Words are equal. */
else
     printf("Yes\n");

逻辑是,如果退出循环,则存在读取错误或找到单词。循环后的分支语句测试 this。

首先,检查文件的错误指示器。如果未设置,则已到达文件末尾,或者找到了单词。

如果找到该单词,则可以设置或不设置文件结束指示符。但是如果没有找到该单词,则必须设置文件结束指示符,否则循环不会退出,因为我们已经排除了第一个 if 语句中的错误指示符。这就是为什么我们检查比较结果而不是使用feof(f)

如果这些情况失败,我们只剩下一种可能性:找到了这个词。

我希望这会有所帮助!

【讨论】:

    【解决方案3】:

    任何时候while (!feof(f)) 在你的代码中,它几乎意味着你在错误的地方。 feof() 只会在读取流的末尾后设置。它并不表示下一次读取将是流的结尾。请参阅here 了解更多信息。

    替换

    while (!feof(f))
    {
        fscanf(f,"%s",wd);  
        ... ...
    }
    

    通过

    while (fscanf(f,"%s",wd))
    {
        ... ...
    }
    

    【讨论】:

    • 那没用。我试过了,但它显示了同样的错误。
    • 谢谢大家,@herohuyongtao,do-while 循环工作了……终于 :)
    猜你喜欢
    • 1970-01-01
    • 2017-11-19
    • 2018-11-18
    • 2022-06-15
    • 2012-05-11
    • 2018-05-15
    • 2018-10-08
    • 1970-01-01
    相关资源
    最近更新 更多