【问题标题】:std::ofstream open file and replace in specific offsetstd::ofstream 打开文件并替换特定偏移量
【发布时间】:2015-03-16 09:22:05
【问题描述】:

我想打开一个文件(不重新创建它)并写入一个特定的偏移量。
这是当前代码:

std::ofstream file(conf_file_path, std::ios::app);
file.seekp(offset, std::ios::beg);
const auto& output = file.write(conf_str, conf_str_len);

但它总是写入文件末尾(可能是由于app 标志)
如果我不使用 app 标志,它会在我打开文件时重新创建文件。

如何在不重新创建的情况下打开它并能够写入特定的偏移量?

【问题讨论】:

  • 只需std::ofstream file(conf_file_path, std::ios::out | std::ios::in);
  • 我建议你检查例如this reference,它有一个很好的表格,列出了不同的 open modes 以及它们对应于 C 函数 fopen 的内容以及文件存在和不存在时模式的作用。
  • 顺便问一下,如果您打开的文件是文本文件,那么所有记录(行等)的大小都是固定的吗?因为如果文件中的数据不是固定大小的,那么你怎么知道要查找的数量?如果你覆盖数据,如果你写的比以前少,你认为会发生什么?

标签: c++ std fstream ofstream


【解决方案1】:

它总是写入文件末尾(可能是由于应用程序标志)

是的,这是由于 app 标志。文档是这样说的:

app - 在每次写入之前寻找到流的末尾


如果我不使用 app 标志,它会在我打开文件时重新创建文件。

如果您在模式中设置了outtrunc 标志,那么它会破坏文件的内容(如果它已经存在)。

如何在不重新创建的情况下打开它并能够写入特定的偏移量?

您可以使用in|out。如果文件不存在,这将出错;如果存在,文件将被打开并从头开始读取。如果要从末尾读取流,可以另外设置ate 标志。

所有这些都清楚地记录在here;阅读手册真的很有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2010-10-23
    相关资源
    最近更新 更多