读取" n"的程序来自用户的行并将其写入C中的文本文件

时间:2014-10-26 02:06:32

标签: c

我被要求编写一个程序,询问用户的整数,该整数表示用户将写入文本文件的句子数。然后用户将写下这些句子。我下面的代码的问题是它只读取我输入的第一个句子,它将被写入文本文件。它有什么问题? 注意: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");
}

2 个答案:

答案 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);
}