単一のファイルストリームでバイナリファイルを読み書きしたい。次のコードは、ファイルの最初の部分を読み取ろうとし、それを使用してファイルの2番目の部分を上書きします。しかし、「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エクスプレスコンパイラを使用していますが、それはバグですか?