高效地将格式化后的内容写入文件
write formatted stuff into file efficiently
我在内存中有一个相当大的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, "%st---@n", cit->c_str());
ofs << buf;
}
ofs.close();
我关心磁盘I/O时间,它有效吗?我有更好的主意吗?
这里有一个混合的想法,利用了不需要格式化任何东西的事实:
for ( /* as you have */ )
{
ofs.write(cit->c_str(), cit->size());
ofs.write("t---@", 5);
}
不要使用C迂回道。试试显而易见的
ofs << *cit << "t---@n";
这应该比您目前拥有的速度更快。我怀疑任何合理的手动调整都不会比库为你做的更快。为什么上面可以假设比你的代码更快:
- 没有分析格式化字符串
- 不复制到临时缓冲区
- 不查找终止的
' '
,因为std::string
将知道其长度
最后一点还不适用于"t---@n"
;您也可以将其转换为std::string
,从而可能获得一点额外的性能。"纯C++"代码更好的原因还有其他:
- 没有缓冲区溢出的危险
- 数据中嵌入的
' '
字符没有问题
磁盘I/O应该不是问题,因为数据流是缓冲的。因此,在将这些字符串一次性写入文件之前,该实现将在内存中收集一些字符串。即便如此,它们也可能存储在操作系统管理的缓存中,以积累更大的大块。因此,磁盘应该只看到很少的巨大写入,这是非常有效的。
这是否有效更多地取决于流的实现,而不是代码。这是应该的。若你们需要一个更高效的流,你们可以实现一个。
然而,正如其他人所指出的,您的代码是不安全的。您应该使用C++流运算符或方法。
相关文章:
- 将从格式化文本文件读取的文本数据存储到链表
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 如何正确格式化csv文件?
- 简单的文本文件格式化在linux下崩溃,但在Windows中很好
- 在 Visual Studio 中格式化C++头文件
- 使用c++只读取已格式化和未格式化数据的文件中的已格式化数据
- 在C 或QT中格式化XML文件
- 加载格式化的二进制文件并将信息分配给结构 c++
- 在 c++ 中读取格式化的文本文件
- 格式化文件异常被 try catch 块忽略
- 以C++格式格式化 CSV 文件
- 我需要一些帮助以有组织的方式格式化文件
- 已知格式化文件中的数据排列
- 使用格式化结果解析搜索/替换头文件
- 在 cpp 文件中格式化 printf 语句
- 在未格式化的文本文件中插入回车
- C++从格式化的.txt文件中读取
- 高效地将格式化后的内容写入文件
- 使用 sscanf 、选项卡格式化日志文件
- 我可以列出将使用 astyle 格式化的文件吗?