Записать пользовательский ввод в файл, а затем прочитать его - PullRequest
0 голосов
/ 02 июня 2018

Я должен получить пользовательский ввод в следующем стиле:

U word word2 word3
U word word2 word3
R word
R word
X

Я хочу записать его в файл и затем прочитать то, что было написано, но программа находится в бесконечном цикле, и файл находится в процессеСозданный, но пустой, мне кажется, что программа по какой-то причине никогда не покидает цикл while, который пишет в файл.

void write_to_file(FILE *fp){
    char buffer[37];
    while(fgets(buffer, 37, stdin)){
        fprintf(fp, "%s", buffer);
    }
    fclose(fp);
}

void read_from_file(FILE *fp){
    char buffer[37];
    char tipo;
    char input_a[6];
    char input_b[26];
    while(fgets(buffer, 37, fp)) {
        sscanf(buffer, "%c %s %[^\n]", &tipo, input_a, input_b);
        switch(tipo) {
            case 'U' :
                // do stuff
                break;
            case 'R' :
                // do stuff
                break;
            case 'X' :
                exit(0);
                break;
            default :
                printf("Invalid Operation\n");
        }
    }
}

int main(){
    FILE *fp = fopen("input.txt","a+");
    write_to_file(fp);
    read_from_file(fp);
    return 0;
}

Я открыл файл с помощью a+, потому что в случае, если файл уже существует, яхочу написать после последней строки

Заранее спасибо.

1 Ответ

0 голосов
/ 02 июня 2018

программа находится в бесконечном цикле? Это из-за ниже while() loop

while(fgets(buffer, 37, stdin)) {
}

Как man 3 fgets говорит

fgets () возвращает s в случае успеха и NULL в случае ошибки или когда происходит конец файла, когда символы не были прочитаны.

вы можете завершить этот цикл, нажав ctrl+d, но если вы нажмете ctrl+d, то вашосновной процесс a.out завершается.Один из способов решения этой проблемы - дать один дополнительный \n или ENTER в качестве входных данных, а затем chen вернуть значение fgets().

Вот пример кода

void write_to_file(FILE *fp){
        char buffer[37], *ptr = NULL;
        while((ptr = fgets(buffer, 37, stdin))!=NULL) { /* It return NULL upon reaching EOF */
                if(*ptr != '\n') { /* at last user enters \n, compare here, if true , break the loop */
                        fprintf(fp, "%s", buffer);
                }
                else
                        break;
        }
        fclose(fp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...