将格式化的东西写入文件有效

时间:2012-07-31 08:21:27

标签: c++ file-io

我的内存中有一个非常大的vector<string>,我想将每个string写入./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();

我关心磁盘I / O时间,它有效吗?我的想法更好吗?

3 个答案:

答案 0 :(得分:2)

这是一个混合的想法,利用了你真的不需要格式化的事实:

 for ( /* as you have */ )
 {
     ofs.write(cit->c_str(), cit->size());
     ofs.write("\t---@", 5);
 }

答案 1 :(得分:1)

不要使用C绕道而行。试试明显的

ofs << *cit << "\t---@\n";

这应该比你现在拥有的更快。我怀疑任何合理的手动调整都可以比图书馆为你做的更快。可以假设上述内容比代码更快的原因:

  • 无法解析格式化字符串
  • 不复制到临时缓冲区
  • 不寻找终止'\0',因为std::string会知道其长度

最后一点不适用于"\t---@\n";您可以将其转换为std::string,以获得更多的额外性能。 “纯C ++”代码更好的原因还有其他原因:

  • 没有缓冲区溢出的危险
  • 数据中嵌入了'\0'字符没有问题

磁盘I / O应该不是问题,因为ofstreams是缓冲的。因此,在将它们一次写入文件之前,实现将在内存中收集许多这些字符串。即便如此,它们可能会存储在由您的操作系统管理的缓存中,以积累更大的数据。所以磁盘只能看到很少的大写,这非常有效。

答案 2 :(得分:0)

这是否有效取决于ofstream的实现而不是代码。这应该是这样的。如果你需要一个更有效的ofstream,你可以实现一个。

然而正如其他人所指出的,您的代码是不安全的。您应该使用C ++流运算符或方法。