0

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

4

1 に答える 1

4

ファイルストリームはbasic_filebuf<>、ストリームバッファにを使用します。C ++ 03規格には、次のように書かれていclass basic_filebuf<charT,traits>ます。

27.8.1.1クラスtempatebasic_filebuf

クラスbasic_filebufは、入力シーケンスと出力シーケンスの両方をファイルに関連付けます。

クラスbasic_filebufのオブジェクトによって制御されるシーケンスの読み取りと書き込みの制限は、標準Cライブラリを使用した読み取りと書き込みの場合と同じFILEです。

特に:-ファイルが読み取り用に開かれていない場合、入力シーケンスを読み取ることはできません。-ファイルが書き込み用に開かれていない場合、出力シーケンスを書き込むことはできません。-ジョイントファイルの位置は、入力シーケンスと出力シーケンスの両方で維持されます。

残念ながら、標準Cライブラリを使用してオブジェクトの読み取りと書き込みを切り替えるとき(または書き込み操作から読み取り操作に移行FILEするとき)にファイルポジショニング呼び出しを実行する必要があることはわかりません。https://stackoverflow.com/a/14879076/12711fflush()を参照してください。

于 2013-03-06T06:40:06.657 に答える