文件处理中的分段错误

时间:2014-01-05 15:08:33

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

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;
}

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

3 个答案:

答案 0 :(得分:0)

第6行:字符串; C中没有字符串数据类型。并且, 第8行:word = GetString(); 您没有包含函数的定义。假设它返回指向字符串的指针,但无论如何都无法工作,因为第6行将无法编译。

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

答案 1 :(得分:0)

@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");

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

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

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

的原因

如果这些案件失败,我们就有一种可能性:找到了这个词。

我希望这有帮助!

答案 2 :(得分:0)

任何时候while (!feof(f))都在您的代码中,几乎意味着您处于错误的位置。只有在读取流的末尾后才会设置feof()。它并不表示下一次读取将是流的结束。有关详细信息,请参阅here

替换

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

通过

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