C++ 未达到EOF时返回true的feof()

C++ 未达到EOF时返回true的feof(),c++,fopen,feof,C++,Fopen,Feof,我试图从特定偏移量的文件中读取(简化版本): 问题是,数据将不包含1008字节,而是529字节(似乎是随机的)。当它达到529字节时,对feof(data_fp)的调用将开始返回true 我也尝试过读取较小的数据块(一次读取8字节),但它看起来好像在达到EOF,而它还没有达到EOF 在十六进制编辑器中进行简单查看即可显示。该文件是否由其他应用程序并行写入?可能存在争用条件,因此当读取正在运行时,文件在读取停止的位置结束,但稍后当您检查它时,其余部分已写入。这也可以解释随机性。像您这样以文本模式打

我试图从特定偏移量的文件中读取(简化版本):

问题是,数据将不包含1008字节,而是529字节(似乎是随机的)。当它达到529字节时,对feof(data_fp)的调用将开始返回true

我也尝试过读取较小的数据块(一次读取8字节),但它看起来好像在达到EOF,而它还没有达到EOF


在十六进制编辑器中进行简单查看即可显示。

该文件是否由其他应用程序并行写入?可能存在争用条件,因此当读取正在运行时,文件在读取停止的位置结束,但稍后当您检查它时,其余部分已写入。这也可以解释随机性。

像您这样以文本模式打开文件,会使库将一些文件内容转换为其他内容,可能会触发不必要的EOF或错误的偏移量计算

通过将“b”选项传递给fopen调用,以二进制模式打开文件

fopen(filename, "rb");

也许这是文本文件和二进制文件之间的区别。若在Windows上,换行符是CRLF,即文件中的两个字符,但在读取时仅转换为一个字符。试着用fopen(…,“rb”)

我在工作中看不到你的链接,但是如果你的计算机声称没有更多的字节,我倾向于相信它。为什么不打印文件的大小,而不是在十六进制编辑器中手工操作

也可以使用2级I/O,F-调用是古丑陋,而你使用C++,因为你有新的.< /P>

int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";
int fh=open(仅文件名);
结构统计;
fstat(fh,s);

cout@pmg,使用malloc/free不能解决我的问题,但是适合你自己:)在C语言中(我不知道C++),我会尝试用二进制打开文件mode@pmg该死就这么简单。。。请创建一个答案,我会接受。偏移量0x004d0a68+529是多少?+1表示十六。你也用vi编辑吗?不!它被另一个应用程序读取,但关闭它,甚至复制文件并更改路径,都会得到相同的结果。。。奇怪的是,随机数(529)每次都是相同的。在大多数情况下,f调用更快,因为它们是缓冲的,而低级调用是无缓冲的。不过,在这种情况下,这并不重要,因为只有一次读取。如果您想要提高速度,请不要使用旧的、粗糙的、带有层层垃圾的C api。如果要进行大量读取,则需要一个高性能缓冲类,是的。
int fh =open(filename, O_RDONLY);
struct stat s;
fstat(fh, s);
cout << "size=" << hex << s.st_size << "\n";