C++ 高效地将格式化的内容写入文件
我在内存中有一个相当大的C++ 高效地将格式化的内容写入文件,c++,file-io,C++,File Io,我在内存中有一个相当大的向量,我想将每个字符串写入/log.txt,我是这样做的: ofstream ofs("./log.txt"); for (vector<string>::const_iterator cit = vec.begin(); cit != vec.end(); cit++) { char buf[30]; sprintf(buf, "%s\t---@\n", cit->c_str()); ofs << buf; } of
向量
,我想将每个字符串
写入/log.txt
,我是这样做的:
ofstream ofs("./log.txt");
for (vector<string>::const_iterator cit = vec.begin(); cit != vec.end(); cit++) {
char buf[30];
sprintf(buf, "%s\t---@\n", cit->c_str());
ofs << buf;
}
ofs.close();
ofs流(“./log.txt”)的;
对于(vector::const_迭代器cit=vec.begin();cit!=vec.end();cit++){
char-buf[30];
sprintf(buf,“%s\t---@\n”,cit->c_str());
ofs这里有一个混合的想法,利用您实际上不需要格式化任何内容的事实:
for ( /* as you have */ )
{
ofs.write(cit->c_str(), cit->size());
ofs.write("\t---@", 5);
}
这里有一个混合的想法,利用您实际上不需要格式化任何内容的事实:
for ( /* as you have */ )
{
ofs.write(cit->c_str(), cit->size());
ofs.write("\t---@", 5);
}
不要使用C绕道,试试明显的
ofs << *cit << "\t---@\n";
ofs不要使用C迂回。试试明显的
ofs << *cit << "\t---@\n";
ofs这是否有效取决于ofstream的实现,而不是您的代码。这就是它应该是什么样子。如果您需要更高效的ofstream,您可以实现一个
然而,正如其他人指出的,你的代码是不安全的。你应该使用C++流操作符或方法。
这是否有效取决于OFFROW的实现而不是代码的使用。这是应该的。如果你需要一个更有效的OFFROW,你可以实现一个。< /P>
然而,正如其他人指出的,你的代码是不安全的。你应该使用C++流操作符或方法。
你关心磁盘I/O。我关心公文缓冲区溢出危险。即使这个方法比OFS快,我也一直在读你的评论。您发布的代码中没有格式。我想知道,您是否认为sprintf会将字符串截断为30个字符?如果是这样,您就错了。只是想了解问题所在。您关心的是磁盘I/O。我关心的是明显的缓冲区溢出危险。即使此方法比ofs的更快,我也已经准备好了正在删除您对所得到答案的评论。您谈到需要格式化,但您发布的代码中没有格式化。我想知道,您是否认为sprintf会将字符串截断为30个字符?如果是这样,您就错了。只是想了解问题所在。@Alcott,我仍然认为没有格式化的必要。反斜杠esc猿是字符串文字的一部分,与PrtTF无关。如果你真的需要格式化,你可能应该用C++的流提供,但是这很大程度上取决于你为什么需要格式化,即什么样的格式化。@奥尔科特,我仍然不需要格式化。反斜杠的逃逸是斯特林的一部分。G文字,与PrtTf无关。如果你确实需要格式化,你可能应该用C++的IOFFASS提供,但是这很大程度上取决于你为什么需要格式化,即什么样的格式化。