将用户输入写入文件然后读取它

时间:2018-06-02 11:41:11

标签: c file user-input

我必须用这种风格接收用户输入:

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 :(得分:0)

程序是无限循环的吗?因为while()循环

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

正如man 3 fgets所说

  

fgets()在成功时返回s,在出错时或结束时返回NULL          在没有读取任何字符时发生文件。

您可以点击ctrl+d来结束此循环,但如果按ctrl+d,您的主进程a.out将被终止。解决此问题的一种方法是最后再输入一个\nENTER作为输入,然后返回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);
}