为什么fgetc函数会添加回车符

时间:2013-03-14 15:27:56

标签: c

我正在读取由字符组成的TXT文件并写入保存char的ASCII值的output.txt文件。 任何时候我在ASCII表(换行)中读取第10个字符,在我的输出文件中我得到 13然后10而不是10 (13表示ASCII中的回车)

我该如何解决? 我的代码:

 in_file = fopen(FILE_NAME, "rb");
...
  while((ch = fgetc(in_file)) != EOF){
    count++;
    fprintf(p, "%d\n", ch);
  }

由于

3 个答案:

答案 0 :(得分:5)

输入文件已使用Windows换行符格式化,这些换行符是\r\n的一对字符。 UNIX文本文件只有\n。因此,您的输出是正确的。

答案 1 :(得分:1)

字符10是换行符(\n);字符13是回车符(\r)。 Windows行终止符通常是回车符后跟换行符。在UNIX / Linux上,行终止符通常只是换行符。在Mac OS上它曾经只是一个回车IIRC,但OS X可能不再是这种情况(因为它是引擎盖下的UN * X)。

该文件可能是在Windows系统上创建的,如@jazzbassrob所述 或者,如果您在Windows系统上运行,我相信I / O库函数的某些实现会将UNIX样式的行终止符转换为Windows样式。

所以,正如其他海报所说,输出可能是正确的。

编辑:
尝试从b的通话中移除fopen();以二进制模式打开文件。在“文本”模式下 - 即fopen(FILE_NAME, "r") - fgetc()可能会丢弃回车。

编辑2: 在文本模式下,行终止符应该“标准化”为换行符(如@DevSolar指出的那样)。另一方面,如果以二进制模式打开文件,则不应假设或依赖特定字符作为行终止符。 (除非您控制输入文件的创建,否则您特别关注从一种格式转换为另一种格式等)。

答案 2 :(得分:0)

您读取回车符(0x0d),因为您以二进制模式"rb"读取文件,这样fgetc()将读取包含0x0d后跟{{1}的每个字符。 (回车)。

如果您将文件作为文字0x0a打开,则fgetc()将跳过"r",如果后跟0x0d,则仅显示0x0a