为什么我的输出格式化,即在fgets中自动'\ n'?

时间:2011-10-05 17:04:29

标签: c fgets

这是我的代码

#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

那么,为什么我打印这两行时会打印两个换行符? 换行符来自何处?

4 个答案:

答案 0 :(得分:3)

fgets将指针设置为表示文件行的char *,包括行尾的\n。 (与大多数字符串的情况一样,它也将'\0'终止)

包含此文件的文件:

  




文件

将来自fgets

This\n\0is\n\0my\n\0file\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()定义为工作的方式。从标准:

  

新行字符(保留)或文件结束后不会读取其他字符。