2

我正在读取一个由字符组成的 TXT 文件,并将这些字符的 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);
  }

谢谢

4

3 回答 3

5

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

于 2013-03-14T15:31:16.780 回答
1

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

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

因此,正如其他海报所指出的那样,输出可能是正确的。

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

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

于 2013-03-14T15:45:19.707 回答
0

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

If you open the file as text "r", fgetc() will skip the 0x0d if followed by 0x0a and display only 0x0a.

于 2013-03-14T15:49:07.387 回答