C++ 我可以用什么容器来写二进制文件?

C++ 我可以用什么容器来写二进制文件?,c++,containers,C++,Containers,我想将一个c数组写入一个容器,如果可能的话,我更愿意修改它。 我曾考虑使用vector,但它似乎有一个write(*pchararray,len);功能。字符串看起来是第二好的东西,但它也没有写功能?不确定你的“写”注释到底是什么意思,但是 std::vector<char> charBuffer; 提供连续的底层内存 所以现在你可以做了 charBuffer.resize(100); memcpy(&charBuffer[0], src, charBuffer.size(

我想将一个c数组写入一个容器,如果可能的话,我更愿意修改它。
我曾考虑使用vector,但它似乎有一个write(*pchararray,len);功能。字符串看起来是第二好的东西,但它也没有写功能?

不确定你的“写”注释到底是什么意思,但是

std::vector<char> charBuffer;
提供连续的底层内存

所以现在你可以做了

charBuffer.resize(100);
memcpy(&charBuffer[0], src, charBuffer.size());

你可以使用向量。预先分配大小,然后寻址第一个字节:保证向量是连续的,所以这总是有效的

std::vector<char> vBuffer;
vBuffer.resize(nLength);
std::copy(pStart, pEnd, &vBuffer[0]);
std::vector vBuffer;
vBuffer.resize(nLength);
std::copy(pStart、pEnd和vBuffer[0]);
给定

char myarray[10];
您可以使用STL
迭代器

vector <char> v;
copy(myarray, myarray + 10, back_inserter(v));
vector <char> v(myarray, myarray + 10);
vector<char> v(10);
copy(myarray, myarray + 10, v.begin());
向量v; 复制(myarray,myarray+10,back_插入器(v)); 您可以使用构造函数

vector <char> v;
copy(myarray, myarray + 10, back_inserter(v));
vector <char> v(myarray, myarray + 10);
vector<char> v(10);
copy(myarray, myarray + 10, v.begin());
向量v(myarray,myarray+10); 您可以调整大小并复制:

vector <char> v;
copy(myarray, myarray + 10, back_inserter(v));
vector <char> v(myarray, myarray + 10);
vector<char> v(10);
copy(myarray, myarray + 10, v.begin());
向量v(10); 复制(myarray,myarray+10,v.begin()); (所有这些对字符串的作用类似)


感谢评论/其他答案:)

容器的选择取决于您对单个元素的使用情况。如果您的意思是将c字符数组复制到conatiner,则可以使用以下方法:

char buf[ n ];
std::vector<char> vc(n); // Thanks to Éric 
std::copy(buf, buf + n, vc.begin()); 
string s( pchararray, len );  // constructor
charbuf[n];
std::向量vc(n);//多亏了埃里克
std::copy(buf,buf+n,vc.begin());

向量、字符串和许多其他容器都有一个用于此目的的“双迭代器”构造函数:

char raw_data[100];
std::vector<char> v(raw_data, raw_data + 100);
std::string s(raw_data, raw_data + 100);
char原始数据[100];
标准:向量v(原始数据,原始数据+100);
std::字符串s(原始数据,原始数据+100);

在这种情况下,您应该更喜欢使用memcpy(因为向量包含一个POD类型),而不是使用std::copy,它要快得多。

您可以使用:

char buf[ n ];
std::vector<char> vc(n); // Thanks to Éric 
std::copy(buf, buf + n, vc.begin()); 
string s( pchararray, len );  // constructor
或:

如果需要,也可以使用string::insert()

如果指定长度,字符串将处理空字符('\0')


参见

很高兴看到Doug T通过复制我的措辞和示例来强化他的答案!这就是我所说的社区精神…@jkp:看起来他/帮助了/你。呃-我不知道这是怎么回事。b:他改变了答案的措辞,并添加了一个示例,显示了我的答案上的调整大小和副本。谢谢你的否决票。我相信没有人想到过这样的例子。。。通过获取第一个元素的地址将向量视为数组,谁会想到呢?你应该在有机会的时候申请专利也就是说,我更喜欢你的答案。我更喜欢jkp的答案,但我看不出这里面有什么让我不高兴的。你们两人使用的例子是非常明显的,编辑你们的文章来改进措辞或添加更多细节是没有犯罪的。恰恰相反,此代码调用未定义的行为。您必须确保vc.size()==n,或者使用back_插入器。由于大小已知,我更喜欢先调整向量大小,然后直接复制到向量中,而不是使用back_插入器。只是为了避免不必要的大小调整和复制。为什么不使用双迭代器构造函数构造一个向量呢?优化:为了防止重复的push_back()不必要的重新分配,在复制()之前保留(sizeof(myarray)/sizeof(myarray[0])