2014-01-05 5 views
0
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; 
} 

Если слово, которое нужно искать, присутствует в файле, оно дает правильный ответ - ДА, в противном случае - его отказ от сегментации (сброс ядра). Пожалуйста, помогите !!Ошибка сегментации при обработке файлов

+1

Что такое 'string' и что' GetString' делает? – P0W

+1

Нет типа 'string' в C. – haccks

+2

http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong – Mat

ответ

0

Строка 6: строковое слово; Нет строкового типа данных в C. И, Строка 8: word = GetString(); Вы не указали определение функции. Предполагая, что он возвращает указатель на строку, но не будет работать, так как строка 6 не будет компилироваться.

Использование: char word [10], если ваше верное слово не длиннее 9 символов.

+0

Функция уже определена и правильная, и она не будет больше 9. – tanmay2893

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).

Если эти случаи терпят неудачу, у нас остается одна возможность: слово найдено.

Надеюсь, это поможет!

0

В любое время while (!feof(f)) в вашем коде, это почти означает, что вы не в тех местах. feof() будет установлен только после чтения конца потока. Это не означает, что следующим чтением будет конец потока. См. here для получения дополнительной информации.

Заменить

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

по

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

Это не сработало. Я пробовал это, но он показывал ту же ошибку. – tanmay2893

+0

@ tanmay2893 Вы можете показать 'GetString()'? – herohuyongtao

+0

Спасибо всем, @herohuyongtao, do-while цикл работал ... наконец :) – tanmay2893

Смежные вопросы