我想一次从二进制文件中读取 8 字节 block ,直到到达文件末尾。为什么这段代码不起作用?有哪些替代方案?
// read a file into memory
#include <iostream>
#include <fstream>
using namespace std;
int main () {
long long int * buffer;
ifstream is;
is.open ("test.txt", ios::binary );
// allocate memory:
buffer = new long long int;
// read data:
while(!is.eof())
is.read (buffer,sizeof(long long int));
is.close();
delete[] buffer;
return 0;
}
如果我将所有 long long int
替换为 char
,代码将完美运行。
引用:代码改编自 www.cplusplus.com
最佳答案
问题是!eof :它告诉您最后操作是否命中eof,不下一个操作是否会命中,以及不最后一个操作是否失败!
在执行 IO 后测试流本身的真实性(或使用失败方法,这是相同的事情,否定):
while (is.read(buffer, sizeof(long long int))) {
// use buffer
}
assert(is.fail()); // must be true
此外,您根本不必使用 new:
long long buffer;
// ...
is.read(reinterpret_cast<char*>(&buffer), sizeof buffer)
// the reinterpret_cast is needed in your original code too
您的来源 cplusplus.com 在使用数据之前也无法检查读取是否成功。总的来说,我发现该网站非常适合列出参数、方法等,而对于其他大多数网站来说则很糟糕。
将它们放在一起,并提供一些示例输出:
#include <climits>
#include <fstream>
#include <iomanip>
#include <iostream>
int main () {
using namespace std;
ifstream in ("test.txt", in.binary);
cout << hex << setfill('0');
for (long long buffer;
in.read(reinterpret_cast<char*>(&buffer), sizeof buffer);)
{
cout << setw(sizeof buffer * CHAR_BIT / 4) << buffer << '\n';
}
return 0;
}
关于c++ - 如何一次从文件中读取多个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869144/