我被要求编写一个程序,询问用户的整数,该整数表示用户将写入文本文件的句子数。然后用户将写下这些句子。我下面的代码的问题是它只读取我输入的第一个句子,它将被写入文本文件。它有什么问题? 注意:getline()由于某种原因不会起作用。请注意"它未在此范围内声明"。我使用DEV-C btw。
main(){
int n;
char line[100];
FILE *in_file;
scanf("%d",&n);
in_file = fopen("lines.txt","w");
for(int i=0;i<n;i++){
gets(line);
fprintf(in_file,"%s",line);
}
fclose(in_file);
system("pause");
}
答案 0 :(得分:2)
1)您应该始终使用gets()
而不是fgets()
。
如果使用gets()
编译代码,您将在GCC上收到以下警告:
/tmp/ccq8G5WV.o:在函数`main&#39;:
writelines.c :(。text + 0x62):警告:`得到&#39;功能很危险,不应该使用。
2)输入要在lines.txt
中写入的行数,即scanf("%d",&n);
后,您需要从输入流中删除\n
。
试试这个例子:
#include<stdio.h>
int main()
{
int n, i, c;
char line[100];
FILE *in_file;
scanf("%d",&n);
//Remove \n from input stream
while ( (c = getchar()) != '\n' && c != EOF );
in_file = fopen("lines.txt","w");
for(i=0; i<n; i++)
{
fgets(line, 100, stdin);
fprintf(in_file,"%s",line);
}
fclose(in_file);
return 0;
}
答案 1 :(得分:0)
上面的答案非常好。 scanf只读取\ n之前的字符,并忽略流缓冲区中的\ n。你应该删除它,否则它将被计为一行。此外,fprintf应该为非常行添加\ n因为gets()也会从输入中删除\ n。如果没有,所有行将一起连接并显示一行。我只是结合上面的答案和原始代码。
#include <stdio.h>
int main(){
int n;
int i;
char c;
char line[100];
FILE *in_file;
scanf("%d",&n);
while ( (c = getchar()) != '\n' && c != EOF )
;
in_file = fopen("lines.txt","w");
for(i=0;i<n;i++){
gets(line);
fprintf(in_file,"%s\n",line);
}
fclose(in_file);
}