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提供,但是这很大程度上取决于你为什么需要格式化,即什么样的格式化。