这是我的代码:
#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以及如何解决此问题?
答案 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'
是一个原始修复,用最多的空格