我必须用这种风格接收用户输入:
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+
打开了文件,因为如果文件已经存在,我想写在最后一行之后
提前致谢。
答案 0 :(得分:0)
程序是无限循环的吗?因为while()
循环
while(fgets(buffer, 37, stdin)) {
}
正如man 3 fgets
所说
fgets()在成功时返回s,在出错时或结束时返回NULL 在没有读取任何字符时发生文件。
您可以点击ctrl+d
来结束此循环,但如果按ctrl+d
,您的主进程a.out
将被终止。解决此问题的一种方法是最后再输入一个\n
或ENTER
作为输入,然后返回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);
}