我正在读取由字符组成的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);
}
由于
答案 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
。