文件输出有两个换行符而不是一个

时间:2013-04-03 14:24:53

标签: c file-io

这是我的代码:

#include<stdio.h>
#include<conio.h>
#include<string.h>
int main()
{ 
    FILE *p;char c[79];
    clrscr();
    p = fopen("file1.dat","w");
    printf("\nenter lines and enter end1 to end ");
    scanf("%s",c);
    if (strcmp(c,"end1") != 0)
       do
       {  
           fputc('\n',p);
           fputs(c,p);
           gets(c);
       } while(strcmp(c,"end1")!=0);

    fclose(p);
    p = fopen("file1.dat","r");
    printf("lines in file:\n");
    while(!feof(p))
    {
        fgets(c,80,p);
        printf("%s\n",c);
    }
    fclose(p);
    return 0;
    getch();
}

我的问题是当我输入(并在文件中写入)时

hello
my name is abc

然后键入end1以终止,当读取和打印文件内容时,我得到输出

hello

my name is abc

为什么打印两个换行而不是1以及如何解决此问题?

3 个答案:

答案 0 :(得分:1)

当您第一次拨打scanf时,您输入的换行符会被遗忘。然后,您将明确的换行符添加到文件中,然后调用gets(这是错误),它会获取第一个换行符,然后再次循环以打印另一个换行符。所以你得到两个。

如果您在getchar()之后立即致电scanf,则会删除额外换行符(只要您输入一个单词后输入)即可。 e.g。

scanf("%s",c);
getchar();             // discard newline
if (strcmp(c,"end1") != 0)
   do
   {  
       fputc('\n',p);  // you probably want to switch these two lines
       fputs(c,p);     //
       gets(c);
   } while(strcmp(c,"end1")!=0);

答案 1 :(得分:1)

请注意以下关于fgets()....

的内容
  

fgets()从流和中读取最多一个小于大小的字符   将它们存储到s指向的缓冲区中。读后停止了   EOF或换行符。如果读取换行符,则将其存储到   缓冲区。 “\ 0”存储在缓冲区中的最后一个字符之后。

鉴于您正在使用fgets()读取文件,然后使用printf(“%s \ n”,...)打印文件,您将输出两个换行符。

答案 2 :(得分:0)

字符串sscanf'd包含换行符,因为这是您键入的内容!

c[strlen(c)] = '\0'是一个原始修复,用最多的空格

替换最后的换行符