我在 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 怎么样?)
有人可以帮我解决一下吗?提前致谢。
最佳答案
这是 Windows 特有的文本文件技巧:SUB
字符,由 Ctrl+Z 序列表示,是 被 fgetc
解释为 EOF
。但是,您不必在文本文件中包含 1A
即可从 fgetc
返回 EOF
:一旦到达实际结尾文件, EOF
将被返回。
标准没有将 1A
定义为 char
值来表示 EOF
。 EOF
的常量是 int
类型,负值在 unsigned char
范围之外。事实上,fgetc
之所以返回一个int
,而不是char
,是为了让它返回一个特殊的值给EOF
.
关于c - 如何为二进制文件和 ascii 文件定义 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780813/