我想用单个文件流读取和写入二进制文件。以下代码尝试读取文件的第一部分,并使用它来覆盖文件的第二部分。但我发现我必须使用“seekp(pos [,ios_base :: begin]);”在写之前。另外,“seekp”实际上并没有改变我的代码中的位置,但它是必要的!任何人都可以解释一下吗?最好是根据c ++标准。非常感谢!
#include <iostream>
#include <fstream>
using namespace std;
int main(){
fstream flib ("tmp.txt", ios::in | ios::out |ios::binary | ios::trunc);
if(!flib){
cerr << "file open failed!" << endl;
return 1;
}
int tmp;
for(int i = 0; i<2 ; i++){//write 2 numbers
flib.write((char*)&i, sizeof(tmp));
}
flib.seekg(0);
while(flib.read((char*)&tmp, sizeof(tmp))){//read file contents
cout <<tmp<<endl;
}
flib.clear();
flib.seekg(0);
flib.read((char*)&tmp, sizeof(tmp));
flib.seekp(sizeof(tmp)); //work
//flib.seekp(sizeof(tmp), ios_base::beg); //work
//flib.seekp(0, ios_base::cur); //not work
//flib.seekp(sizeof(tmp), ios_base::end); //not work
//flib.seekp(-sizeof(tmp), ios_base::end); //not work
flib.write((char*)&tmp, sizeof(tmp));
flib.clear();
flib.seekg(0);
while(flib.read((char*)&tmp, sizeof(tmp))){//read file contents
cout <<tmp<<endl;
}
return 0;
}
评论:我发现如果我使用flib.seekp(some_number,ios_base :: cur);非零some_number,它的工作原理。而且我使用vs2012 express编译器,这是一个bug吗?
答案 0 :(得分:4)
文件流使用basic_filebuf<>
作为流缓冲区。 C ++ 03标准可以说class basic_filebuf<charT,traits>
:
27.8.1.1 Class tempate basic_filebuf
类basic_filebuf将两个输入关联起来 序列和带文件的输出序列。
读取和写入由...控制的序列的限制 class basic_filebuf的对象与for相同 使用标准C库
FILE
进行读写。特别是: - 如果文件未打开以进行读取,则无法读取输入序列。 - 如果文件未打开以进行写入,则无法写入输出序列。 - 为输入序列和输出序列保持联合文件位置。
不幸的是,当使用标准C库在读取和写入FILE
对象之间进行转换时,您必须执行文件定位调用(或从fflush()
转换时写操作以读取操作)。请参阅https://stackoverflow.com/a/14879076/12711。