Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不使用seekp值的Write函数_C++_Filestream_Seek - Fatal编程技术网

C++ 不使用seekp值的Write函数

C++ 不使用seekp值的Write函数,c++,filestream,seek,C++,Filestream,Seek,我试图用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

我试图用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
但是如果我使用ate或什么都不使用,它总是会删除文件的内容


任何帮助都会很好:)

是的,是
ios::app
导致了这种行为。将其替换为
ios::in | ios::out


<> > >编辑:>你的问题不清楚,但是你的评论表明你试图在文件中间插入数据,而不是覆盖文件的一部分。如果确实是这样的话,您几乎必须使用第二个文件来完成此操作。

您是否尝试过使用
ios::out
而不是
ios::app

编辑:

阅读@curiousguy引用的文档后,您似乎需要
ios::in | ios::out
而不是
ios::out
来避免截断。

文件附加模式 如果操作系统(以及网络文件系统,如果适用)支持附加模式,则设置附加模式可确保写入的数据不会在存在多个写入程序时覆盖文件中的现有数据。这是没有append模式无法做到的,因为不同进程的seek和write之间存在竞争。这是日志文件的重要保证

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

Iostream开放模式 根据[ofstream.cons],
ofstream(s,mode)
调用
rdbuf()->open(s,mode | ios_base::out)

根据[filebuf.members]中的“文件打开模式”表,
filebuf::open
的行为定义为
fopen
打开模式:

  • out
    表示“w”
  • app
    app | out
    表示“a”
  • in | out
    表示“r+”
  • in | out | trunc
    表示“w+”
根据fopen man,模式意味着:

  • r+打开阅读和写作
  • w将文件截断为零长度或创建用于写入的文本文件
  • w+打开阅读和写作。如果文件不存在,则创建该文件,否则将截断该文件
  • a打开以进行追加(在文件末尾写入)。如果文件不存在,则创建该文件
最后,
ate
表示
fseek(文件,0,SEEK\u END)

因此,如果要在任意位置打开以进行写入,而不破坏现有数据,则需要
fopen(s,“r+”)
流(s,ios::in | ios::out)

注意,在C/C++中,您还需要对文件进行读访问,才能在不覆盖文件的情况下打开文件进行写入

POSIX世界 您可能需要使用POSIX
open
功能,以便直接访问POSIX开放标志:
O_READ
O_WRITE
O_create
O_EXCL
O_TRUNC
。。。与
filebuf::open
标志不同,它们不仅功能更强大,而且具有独立的正交标志和良好的性能


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

的流默认为ios::out。添加ios::in会破坏程序。@帕特:嗯,默认值是不相关的,因为您没有使用它(您使用的是
ios::binary…
)。还有,当你说“中断”时,具体是以什么方式?@Paté:是的,你不能先查找然后插入数据。它将刚刚开始覆盖现有数据。您必须输出第一部分(直到要插入的位置),插入新数据,然后附加其余部分。是否要截断现有文件?