Это:
found = 0; /*I thought this was my loop terminator, but it has no effect.*/
не имеет никакого эффекта, потому что found
уже уже 0
на данный момент, и потому что ваше условие цикла равно while (!found)
, что означает "в то время как found
не является ненулевым, т. е. «в то время как found
равно нулю».
Но это нормально.Реальная проблема в том, что это:
fscanf(fp, "%s", input);
в конце концов достигнет конца файла и вернет EOF
, но вы не проверяете его возвращаемое значение;поэтому, если вы достигнете конца файла, не найдя записи, вы никогда не выйдете из цикла.
Итак, вы можете изменить это:
while (!found) {
if (strcmp(input, "MyName") == 0) {
printf("Record found.");
found = 1;
}
/*This is the part I can't get to work. I don't know what's off.*/
else {
printf("Record not found."); /*Printing this so I can see how many times it's
checking. It never terminates. How do I get it to scan through the file ONCE and then
stop?*/
fscanf(fp, "%s", input);
found = 0; /*I thought this was my loop terminator, but it has no effect.*/
}
}
на следующее:
while (!found) {
if (strcmp(input, "MyName") == 0) {
found = 1;
} else {
if(fscanf(fp, "%s", input) == EOF) { // end-of-file (or error)
break;
}
}
}
if(found) {
printf("Record found.\n");
} else {
printf("Record not found.\n");
}
Отредактировано, чтобы добавить: Я только что видел комментарий Махеша выше, что делает хороший момент.Вам также нужно изменить эти две строки:
char *input;
input = "new name"; /*I get a compiler error if I don't initialize input*/
на что-то вроде этого:
char input[1024]; /* allocate space for up to 1024 characters */
и это:
fscanf(fp, "%s", input)
на что-то такое:
fscanf(fp, "%1023s", input) /* read at most 1023 characters */
в обоих местах.