【问题标题】:Trailing \n when i use fgetc当我使用 fgetc 时尾随 \n
【发布时间】:2014-03-19 11:29:03
【问题描述】:

我编写了一个简单的函数来读取文本文档并按原样打印。但是我在输出中看到一些尾随 \n。我无法找出原因。

void read_file(FILE* fp , char* s)
{
  int i=0;
  char c;
  while( (c=fgetc(fp)) !=EOF )
  {
    s[i]=c;
    //fseek(fp,1,SEEK_CUR);
    i++;
  }
  printf("%d is length of file\n",i);
  s[i]='\0';

  printf("%s",s);
}

我的文本文档包含

我是

这里

【问题讨论】:

  • 您不想包含换行符?

标签: c file io


【解决方案1】:

首先:您需要将c 声明为intfgetc 的返回值为int,因为char 通常不足以容纳EOF

在输出中出现尾随换行符的原因可能是因为c 不是int,或者是因为您的输入文件包含尾随换行符。

【讨论】:

  • c 不是int 怎么能说明问题?
  • 因为行为是不确定的,我想对冲我的答案。实际结果可能是,如果文件包含值为 -1 的字节,它要么停止从文件读取,要么写入一大堆值为 255 的字节,直到磁盘空间用完。
  • 我只是想知道为什么这是一个未定义的行为。如果char 类型实现为signed char,那么c 可以保存EOF 的值。如果char 类型被实现为unsigned char,那么它将是一个定义为行为的无符号整数溢出。是不是因为在后一种情况下,c 的值不会代表机器字符集中的任何字符?
  • 我认为您假设 EOF == -1。该标准没有这样的要求。如果 EOF 定义为 9999 且 chars 为 8 位,则 EOF 不能存储在 char 中。
  • 我在 SO 上的答案中读到 EOF 的值基本上是负数。但是,我不知道它是否是标准规定的。
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 2021-03-17
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
相关资源
最近更新 更多