我有一个二进制文件,我在其中保存了以下变量数百万次:
目前我正在使用 ifstream 打开和读取文件,但我想知道是否可以通过将整个文件加载到内存中并减少 I/O 来加快执行时间。
如何将文件加载到内存中,然后将其转换为我想要的变量?使用 ifstream 这很容易完成,但我不知道如何缓冲它然后提取数据。
这是我用来保存数据的代码:
osfile.write(reinterpret_cast<const char*> (&sz), sizeof(int));// Size of vector
osfile.write(reinterpret_cast<const char*> (&vec[0]), sz*sizeof(float));
osfile.write(reinterpret_cast<const char*> (&a), sizeof(unsigned int));
osfile.write(reinterpret_cast<const char*> (&b), sizeof(unsigned int));
我猜你的写过程中缺少某些东西,因为你的写流中缺少 vector 的大小......
size_t size = vec.size();
osfile.write(reinterpret_cast<const char*> (&size), sizeof(size_t));
osfile.write(reinterpret_cast<const char*> (&vec[0]), vec.size()*sizeof(float));
osfile.write(reinterpret_cast<const char*> (&i), sizeof(unsigned int));
osfile.write(reinterpret_cast<const char*> (&i), sizeof(unsigned int));
然后你可以将全局文件缓冲区加载到内存中: Read whole ASCII file into C++ std::string
然后,将加载的缓冲区传递给 istringstream iss;
对象
然后,以与编写流相同的方式读取流(流方法):
float tmp;
size_t size_of_vector;
// read size of vector
iss >> size_of_vector;
// allocate once
vector<float> vec(size_of_vector);
// read content
while(size_of_vector--)
{
iss >> tmp;
vec.push_back(tmp);
}
// at the end, read your pair of int
unsigned int i1,i2;
iss >> i1;
iss >> i2;
编辑:打开/读取流时,您仍然需要注意二进制与字符的考虑......
我是一名优秀的程序员,十分优秀!