我发现以下代码将包含浮点数的文件读取为二进制:
#include <fstream>
#include <vector>
// ...
// Open the stream
std::ifstream is("input.dat");
// Determine the file length
is.seekg(0, std::ios_base::end);
std::size_t size=is.tellg();
is.seekg(0, std::ios_base::beg);
// Create a vector to store the data
std::vector<float> v(size/sizeof(float));
// Load the data
is.read((char*) &v[0], size);
// Close the file
is.close();
我有点不确定的是:
is.seekg(0, std::ios_base::beg);
这行,如果我理解正确的话,它应该将输入位置从0偏移std::ios_base::beg
。但是 std::ios_base::beg
不是总是 0 因为它指的是流的开头吗?意思是 is.seekg(0)
或 is.seekg(std::ios_base::beg)
会达到相同的效果,但更简单。
请参阅 seekg
的文档
了解具体信息,但这里本质上有两个函数签名。
istream& seekg (streampos pos);
这设置了一个绝对位置,从文件开头开始索引为 0。
istream& seekg (streamoff off, ios_base::seekdir way);
此另一个设置相对于流的三个选项之一的位置:(1) 开头,(2) 当前位置,或 (3) 结尾。所以,
is.seekg(0)
和
is.seekg(0, std::ios_base::beg)
是等价的。如果您的示例可以编译,则可能会起作用,但只能通过
std::ios_base::beg
的值为 0 的运气。我认为这应该被视为一个错误,特别是对于某些对这些常量使用不同值的系统。前者可能更简单,但后者更清晰。并且永远记住要善待那些必须维护你的代码的可怜虫,因为它可能就是你。