gpt4 book ai didi

c - 在 EOF 后读取文件

转载 作者:太空宇宙 更新时间:2023-11-04 05:52:03 25 4
gpt4 key购买 nike

可以在 EOF 之后读取文件吗?

我正在读取一个文件,该文件可能在其结尾之前包含一个 EOF 字符或多个 EOF 字符。该文件是一个简单的 txt,我能够使用 fsize 知道字符数,但看起来 getc 从 EOF 到文件末尾返回 EOF(或 -1)。

int c = 0;
char x;
FILE *file = fopen("MyTextFile.txt", "r");
off_t size = fsize("MyTextFile.txt");

while (c < size) {
x = getc(file);
if (x != -1)
printf("%c ", x);
else
printf("\nFOUND EOF!\n");
c++;
}
fclose(file);

不幸的是,即使我确定文件内容在 EOF 之后继续,我也无法读取其余部分。

已解决:使用“rb”而不是“r”读取并使用 x 作为 int 允许我读取整个文件,包括多个 EOF。不确定这是一个把戏还是允许的事情,但确实有效。

最佳答案

从逻辑上讲,EOF(文件结尾)之后没有数据。

注意 EOF 不是一个字符;它是 getc() 在遇到文件结束或错误情况后返回的特殊值,返回的值而不是字符值。

您没有在问题中这样说,但我猜您有一个 Windows 文本文件,其中包含一个或多个嵌入的 Ctrl-Z (0x1a) 字符。这是我能想到的唯一与您的描述一致的。

在 Windows 中,文本文件中的 Ctrl-Z 字符被视为文件结尾。 (这可以追溯到早期的系统,数据的结尾没有明确标记,因为文件系统只记录 block 数。)Ctrl-Z 不是 EOF 字符;它是一个字符值,在 Windows 上触发文件结束条件并导致 getc() 返回 EOF

基本上你有一个格式错误的文本文件,你应该修复它和/或修复它生成的任何内容。但如果你真的需要从中读取数据,我建议以二进制模式而不是文本模式打开它。然后,您会看到每个 CR/LF 行尾标记都是两个字符('\r''\n' 而不仅仅是 '\n'),而 Ctrl-Z (0x1a) 只是另一个字节值。由于您并没有真正将文件视为文本(“文本”以第一个 Ctrl-Z 结尾),因此以二进制模式读取它是有意义的。

可能有一些技巧可以让您在文本模式下通过 Ctrl-Z 阅读;例如 clearerr() 可能会起作用。但这样做超出了 C 标准所保证的范围——这对您来说可能是问题,也可能不是问题。

此外,您绝对应该使用符号 EOF而不是“魔数(Magic Number)”-1。甚至不能保证 EOF == -1,使用符号 EOF 将使您的代码更加清晰。

最后,感谢 Mark Plotnick 在评论中指出了一些我自己应该注意到的事情。 getc() 返回一个int 结果;您将其分配给 char 对象。 x 必须是 int 类型,而不是 char。这是必要的,以便您可以区分 EOF 的值和任何实际字符的值。

关于c - 在 EOF 后读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38128283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com