繁体   English   中英

为什么fgetc函数添加回车符

[英]Why does fgetc function add a carriage return

我正在读取由字符组成的TXT文件,并将这些字符的ASCII值写入output.txt。

每当我在ASCII表(换行)中读取char号10时,我在输出文件中得到的是13,然后是10,而不是10。 (13表示ASCII格式的回车)

这是我的代码:

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

谢谢

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

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

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

因此,正如其他张贴者所指出的那样,输出结果可能是正确的。

编辑:
尝试从对fopen()的调用中删除b 以二进制模式打开文件。 在“文本”模式下,即fopen(FILE_NAME, "r")fgetc()可能会放弃回车符。

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

您读取了回车符( 0x0d ),因为您以二进制模式"rb"读取了文件,因此fgetc()将读取每个字符,包括0x0d0x0a (回车符)。

如果以文本"r"打开文件,则fgetc()将跳过0x0d如果后面跟着0x0a并且仅显示0x0a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM