写入函数不使用seekp值

Write function not using the seekp value

本文关键字:seekp 函数      更新时间:2023-10-16

我正在尝试使用c++在文件中的特定位置编写条目

基本上我有

ofstream ofs("file.dat", ios::binary | ios::app);
ofs.seekp(220, ios::beg);
ofs.write((char *)&i, sizeof(i));

但是不管我怎么做,它总是写在文件的末尾。

我想这与iso::app有关,因为根据文档

app (append) Set the stream's position indicator to the end of the stream before each output operation

但是如果我使用或者什么都不使用,它总是会擦除文件的内容。

如果有任何帮助就太好了

是的,这是导致这种行为的ios::app。用ios::in | ios::out代替

edit:从您的问题中不清楚,但您的评论表明您正在尝试在文件中间插入数据,而不是覆盖文件的一部分。如果确实是这种情况,您几乎必须使用第二个文件。

文件追加模式

如果操作系统(和网络文件系统,如果适用)支持追加模式,设置追加模式可以保证当有多个写入器时,写入的数据不会覆盖文件中已有的数据。如果没有追加模式,就无法做到这一点,因为来自不同进程的查找和写入之间存在竞争。它是日志文件的重要保证。

在追加模式下,根据定义只能在文件末尾写入。

Iostream open modes

根据[ofstream]。, ofstream (s, mode)调用rdbuf()->open(s, mode|ios_base::out)

根据[filebuf. exe]中的"文件打开模式"表。, filebuf::open的行为定义为fopen的开放模式:

  • out表示"w"
  • appapp|out表示"a"
  • in|out表示"r+"
  • in|out|trunc表示"w+"

根据fopen man,模态的意思是:

  • r+打开读写。
  • w截断文件长度为零或创建用于写入的文本文件
  • w+打开读写。如果该文件不存在,则创建该文件,否则将截断该文件。
  • a打开追加(在文件末尾写入)。如果文件不存在,则创建该文件。

最后,ate表示fseek(file,0,SEEK_END)

因此,如果您想在不破坏现有数据的情况下在任意位置打开写入,则需要fopen(s,"r+")ofstream (s, ios::in|ios::out)

在C/c++中,您还需要对文件进行读访问以打开它进行写入,而不覆盖它!

<标题> POSIX世界

为了直接访问POSIX打开标志:O_READ, O_WRITE, O_CREAT, O_EXCL, O_TRUNC……你可能想使用POSIX open函数来代替。它们不仅更强大,而且是独立的正交标志,并且表现良好,不像filebuf::open标志。

当然,这个函数不是标准c++的一部分。我相信所有与正常编程相关的系统(不是具有特殊特性的利基市场)都支持open

你试过用ios::out代替ios::app吗?

编辑:

在阅读了@curiousguy引用的文档之后,看起来您需要ios::in | ios::out而不仅仅是ios::out来防止截断