与fstream一起seekp和seekg
seekp and seekg with fstream
我注意到这个奇怪的东西
fstream obj(filename , ios::in);
obj.seekp(7);
与相同
fstream obj(filename , ios::in);
obj.seekg(7);
seekg
和seekp
执行相同的操作并导致相同的结果,尽管我在仅标记中指定了ios:
为什么他们都与fstream合作?使用fstream的seekp
和seekg
有什么区别?
basic_fstream
源自basic_iostream
,后者源自basic_istream
和basic_ostream
。因此,basic_fstream
具有来自basic_ostream
的函数seekp
和来自basic_ifstream
的函数seekg
。
简而言之,在您的情况下,对seekp和seekg的调用执行相同的操作,因为basic_filebuf::seekpos
执行的操作仅取决于basic_filebuf
的打开模式
basic_ostream<charT,traits>& seekp(pos_type pos);
效果:如果失败()!=true,执行rdbuf()->pubseekpos(pos,ios_base::out)。在故障的情况下,该函数调用setstate(failbit)(可能引发iosbase::failure)
其中pubseekpos
调用seekpos
(即virtual
,因此调用basic_filebuf::seekpos
)
pos_type seekpos(pos_type sp,
ios_base::openmode which = ios_base::in | ios_base::out);
如果可能,更改文件位置,使其与sp中存储的位置相对应(如下所述)。更改文件位置的操作如下:
if(om&ios_base::out)!=0,然后更新输出序列并写入任何未移位的序列;
将文件位置设置为sp;
3.if(om&ios_base::in)!=0,然后更新输入序列
其中om是传递给最后一次调用open()的打开模式。如果is_open()返回,则操作失败false。
由于您使用ios_base::in
函数打开文件,因此会执行2个和3个点。
basic_istream<charT,traits>& seekg(pos_type pos);
效果:表现为未格式化的输入函数(如27.7.2.3第1段所述),但该函数首先清除eofbit,它不计算提取的字符数,也不计算影响后续调用gcount()返回的值。构造哨兵对象后,如果失败()!=true,执行rdbuf()->pubseekpos(pos,ios_base::in)。如果失败,函数将调用setstate(failbit)(可能引发ios_base::failure)
- 使用 seekg() 读取C++中的文件时出现问题
- 字母 'f' 在 printf()、scanf() 和 seekg() 中的 'g' 代表什么?
- basic_istream::seekg() 似乎不起作用
- 读取文本文件时 seekg() 的奇怪偏移量
- Seekg 的行为不符合预期
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 使用 seekp() 和 tellg() 进行数据处理
- 检查 istream::read 和 istream::seekg 失败的最佳方法
- seekg 和 seekp :seek(streampos pos) 和 seek(streamoff off, ios
- 与fstream一起seekp和seekg
- 使用seekg和seekp得到错误的输出
- 如何在c++中使用seekg和seekp附加到文件,而不使用ios:app标志
- C ++ fstream 写入不适用于没有 seekg 和 seekp 的二进制文件
- 在处理二进制文件时了解 Seekg() 和 seekp()
- Seekp 和 seekg 不适用于 Fstream
- "fseek"、"lseek"、"seekg"、"seekp"有什么区别?
- 使用 fstream 创建文件,如果它不存在使用 seekp/seekg?
- c++, fstream和seekp和seekg,奇怪的程序
- 同一文件上的 seekp()、seekg()、read() 和 write() 有问题
- "seekp"和"seekg"可以互换吗?