【发布时间】:2016-04-19 06:15:54
【问题描述】:
我在 Windows 上编程 C(系统语言是日语),我遇到了二进制和 ascii 文件的 EOF 问题。
上周我问了this question,一位好心人帮助了我,但我仍然无法真正理解程序在读取二进制文件或 ascii 文件时是如何工作的。
我做了以下测试:
测试1:
int oneChar;
iFile = fopen("myFile.tar.gz", "rb");
while ((oneChar = fgetc(iFile)) != EOF) {
printf("%d ", oneChar);
}
测试2:
int oneChar;
iFile = fopen("myFile.tar.gz", "r");
while ((oneChar = fgetc(iFile)) != EOF) {
printf("%d ", oneChar);
}
在 test1 案例中,二进制文件和 ascii 文件都运行良好。但在 test2 中,程序在二进制文件中遇到 0x1A 时停止读取。 (这是否意味着 1A == EOF?)ASCII 表告诉我 1A 是一个名为 substitute 的控制字符(不管这意味着什么......)当我 printf( "%d", EOF),但是,它给了我 -1...
我还找到了this question,它告诉我操作系统确切地知道文件的结束位置,所以我真的不需要在文件中找到 EOF,因为 EOF 超出了一个字节的范围(1A 怎么样?)
有人可以帮我澄清一下吗?提前致谢。
【问题讨论】:
-
下面是关于你遇到的0x1A的char的一些解释:en.wikipedia.org/wiki/Substitute_character
-
您是如何确定它在 0x1A 处停止读取的?如果它在其输出末尾打印数字 26 (0x1A),这意味着它正常读取该字节,但在尝试读取 之后的任何内容时得到 EOF。如果 0x1A 是 EOF,您根本不会在输出中看到该值。
-
我最后使用了 system("PAUSE") 。所以在 Test1 案例中,它打印为:1 23 43 ... 150 26 46 ... 按任意键继续,但在 Test2 中,它打印为:1 23 43 ... 150 按任意键继续。在 Test1 中,打印了 26,但在 Test2 中,26 之前的数字 150 是它打印的最后一个字符。所以我认为在 Test2 中,26 使 (oneChar = fgetc(iFile)) != EOF 成为错误陈述