写入函数不使用seekp值
Write function not using the seekp value
我正在尝试使用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" -
app
和app|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
来防止截断
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- Seekp函数在Xcode、C++中无法识别
- 写入函数不使用seekp值