这是我的代码
#include<stdio.h>
int main()
{
FILE* fp;
int i;
fp=fopen("newfile","r");
if(fp==NULL)
{
printf("hhaha");
return 0;
}
char str[20];
for(i=0;i<2;i++)
{
fgets(str,20,fp);
printf("%s",str);
}
return 0;
}
现在,如果我的新文件有文本
那么,为什么我打印这两行时会打印两个换行符? 换行符来自何处?我的名字
是xyz
答案 0 :(得分:3)
fgets
将指针设置为表示文件行的char *
,包括行尾的\n
。 (与大多数字符串的情况一样,它也将'\0'
终止)
包含此文件的文件:
此
被
我
文件
将来自fgets
:
This\n\0
,is\n\0
,my\n\0
,file\n\0
1
1 最终值可能不包括\n
。这取决于它是否是\n
终止文件。
答案 1 :(得分:1)
来自man fgets
gets()从stdin读取一行到指向的缓冲区 通过s直到它取代的终止换行符或EOF '\ 0'。不执行缓冲区溢出检查 (见下面的BUGS)。
fgets()从中读取最多一个小于大小的字符 流并将它们存储到s指向的缓冲区中。阅读停止 在EOF或换行符之后。 如果读取换行符, 它存储在缓冲区中。在最后一个之后存储'\ 0' 缓冲区中的字符。
因此fgets
行为与您的预期不同
答案 2 :(得分:0)
来自fgets()的linux手册页:
fgets()从中读取最多一个小于大小的字符 流并将它们存储到s指向的缓冲区中。阅读停止 在EOF或换行符之后。 如果读取换行符,则将其存储到 缓冲区。 A'\ 0'存储在缓冲区中的最后一个字符之后。
答案 3 :(得分:0)
fgets()
在读取字符串时包含换行符 - 这就是fgets()
定义为工作的方式。从标准:
新行字符(保留)或文件结束后不会读取其他字符。