c - 如何为二进制文件和 ascii 文件定义 EOF

标签 c windows file

我在 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 值来表示 EOFEOF 的常量是 int 类型,负值在 unsigned char 范围之外。事实上,fgetc之所以返回一个int,而不是char,是为了让它返回一个特殊的值给EOF.

关于c - 如何为二进制文件和 ascii 文件定义 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34780813/

相关文章:

c - 添加程序在我给它输入时崩溃

C: 声明指向函数的易失指针

c++ - 如何在 Vista/Server 2008 上使用 std::shared_mutex?

windows - 完全从头开始编写 COM 对象?

java - 如何检查登录信息是否与文件中的记录相对应? ( socket )

linux - 在 Bash 中同时遍历文件中的行和目录中的文件

c - 如何在C中重新排序n维矩阵的维度? (类似于排列(A,[2 :n 1]) in Matlab )

c++ - Ncurses:创建下一个窗口后无法在上一个窗口中写入

c++ - 如何创建跨平台窗口处理程序?

c - read() 调用后 Printf 打印垃圾。偏移量始终打印为 0