非常奇怪,我没有在stackoverflow上找到这个问题的答案。
我想将std::vector<int>
保存到文件中。
在不同的地方,我发现了以下代码:
std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostreambuf_iterator<char>(outfile));
outfile.close();
但问题是,std::ostreambuf_iterator<char>
将v
的每个值转换为char
,然后再将其写入文件。因此,值256
和512
会更改为0
。结果文件在hexedit下显示如下:
00000000 00 01 02 04 08 10 20 40 80 00 00
我的想法是将std::ostreambuf_iterator<char>
更改为std::ostreambuf_iterator<int>
,但这不起作用。编译器抛出错误:
error: no matching function for call to ‘std::ostreambuf_iterator<int>::ostreambuf_iterator(std::ofstream&)’
std::copy(v.begin(), v.end(), std::ostreambuf_iterator<int>(outfile));
如何解决这个问题?
答案 0 :(得分:1)
您正在寻找std::ostream_iterator
,而不是std::ostreambuf_iterator
。
std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data", std::ios::out | std::ofstream::binary);
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();
请注意,结果输出为:
01248163264128256512
这只是将int
向量中的值写入输出流,就像使用<<
运算符一样,但没有任何分隔符,这可能是您真正想要的,也可能不是。但这就是它的作用。
答案 1 :(得分:1)
您可以序列化为二进制,只需记住字节序等问题就可以了。基本上,使用std :: ofstream和ifstream write()和read()。
序列化和反序列化的两个编程如下所示,快速入侵,因此可能存在错误:
#include <fstream>
#include <stdexcept>
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
using std::ofstream;
using std::ios;
int main()
{
vector<int> datavec{0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512};
ofstream outfile;
outfile.open ("datafile.bin", ios::out | ios::trunc | ios::binary);
for (auto val : datavec) {
outfile.write(reinterpret_cast<const char *>(&val), sizeof(int));
if (outfile.bad()) {
throw std::runtime_error("Failed to write to outfile!");
}
}
cout << "Wrote data to file. Done.\n";
}
//////////////////////////////////////////////////
#include <fstream>
#include <stdexcept>
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
using std::ifstream;
using std::ios;
using std::ios_base;
int main()
{
vector<int> datavec;
ifstream infile;
infile.open ("datafile.bin", ios::in | ios::binary);
while (infile) {
int val;
infile.read(reinterpret_cast<char *>(&val), sizeof(int));
if (infile.bad()) {
throw std::runtime_error("Failed to read from infile!");
}
if (infile.eof()) break;
datavec.push_back(val);
}
cout << "Read data file. Contents of datavec: \n";
for (auto val : datavec) {
cout << val << ", ";
}
cout << "\nDone\n";
}
答案 2 :(得分:0)
或者,在创建流时删除std::ofstream::binary
(您也可以删除std::ios::out
,因为这是ofstream
的默认值。
主要是使用std::ostream_iterator<int>
代替std::ostreambuf_iterator<char>
。
std::vector<int> v{0,1,2,4,8,16,32,64,128,256,512};
std::ofstream outfile("test.data");
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(outfile));
outfile.close();
您可能还想在创建ostream_iterator
时添加分隔符。
答案 3 :(得分:0)
如果您希望将整数作为字符写入文件,则可以使用for_each:
std::for_each(v.begin(), v.end(), [&outfile](int x){outfile << x;});
这会将整数作为字符串写入文件的一行,它们之间没有空格,即:
01248163264128256512