В C: Как прервать цикл while при сравнении вывода строки во внешний файл - PullRequest
0 голосов
/ 20 марта 2012

(Это для C, Unix в tcsh.)

Я пытаюсь записать строку во внешний файл (вывод), затем сравнить мой вывод с вводом файла.Если выходные данные существуют в этом файле, я хочу напечатать «Запись найдена».Если вывод не существует в этом файле, я хочу напечатать «Запись не найдена».

Я использую цикл while для сравнения вывода с вводом.У меня есть бит работы, где, если запись найдена, цикл завершается и печатает «Запись найдена».

Я не могу заставить работать "остальное".Пожалуйста, смотрите мой комментарий в коде об этом.

Я читаю текст, заметки и гуглю в течение 48 часов.Кажется, я не могу это исправить.

Спасибо за любую помощь.

    /*This program opens a file, compares output to file input*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILE_NAME "~/MyFiles/File1"

int main() {

FILE *fp;
char *input;
char *output;
output = "MyName";
input = "new name"; /*I get a compiler error if I don't initialize input*/
int found = 0;

/*Open file, write output ("MyName") to file in order to compare below*/
fp = fopen(FILE_NAME, "a+");
fprintf(fp, "%s\n", output);
fclose(fp);

/*Testing to see what it prints, not relevant to my question other than reopening the         
file to read in and compare below*/
fp = fopen(FILE_NAME, "r");
fscanf(fp, "%s", input);
printf("\n%s", input);

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.*/
   }
}

fclose(fp);
return 0;

}

Ответы [ 2 ]

0 голосов
/ 20 марта 2012
found=0;

0 - ложь в с. Так что если наверху вы зацикливаетесь на

while(!found)

, которое оценит как истинное. Поскольку вы не выходите из цикла в EOF, то, если его нет в файле, если выходной файл не находится в файле точно так, как вы ожидаете, то цикл будет длиться вечно.

В других новостях вы должны уделить некоторое внимание буферам и тому, как они должны быть расположены в C.

0 голосов
/ 20 марта 2012

Это:

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 */

в обоих местах.

...