2016-04-03 7 views
-2

fstreamを使って読み書きするためにファイルを開き、各文字を読み込んでその文字をファイルに書き戻す必要があります。たとえば、私はこのコードを持っています。読み書き用のC++ファイルストリーム

「ABCD」を含む"test.txt"というファイルがあります。ストリームオブジェクトのput()get()の両方のメソッドは、ファイルポインタを前方に移動します(これは、tellg()またはtellp()の戻り値を各get()またはput()メソッドコールの後に取得することによってわかります)。私の質問は、ストリームポインタを "どこにあるか"(in.seekg(in.tellg())にしようとしているコードをコメントアウトすると、コードが不正確な結果になります。私はtellg()が読み取るべき文字の正しい位置を示しているので、これがなぜであるのか分からない。明示的にそれを求める目的は何か?私はVisual Studio 2005を使用しています。

誤った結果は、 "ABCD"ではなく "ABBB"というファイルに書き込みます。

+0

なぜこの「シーク」ビジネスをやっているのですか? – ForceBru

+0

どのように正確に「間違った」結果? – mazhar

+0

'tellg()'は 'int'ではなく' streampos'を返します。あなたの「間違った」結果は何ですか? –

答えて

0

出力バッファは、書き込みと読み出しの切り替え時にフラッシュする必要があります。

fstream in("test.txt",ios::in | ios::out); 
if(!in) 
    cout<<"error..."; 
else 
{ 
    char ch; 
    in.seekg(0,ios::end); 
    int end=in.tellg();//get the length 

    in.seekg(0);//get back to the start 
    for(int i=0;i<end;i++) 
    { 
     if(!in.get(ch).fail())//read a character 
     { 
      in.seekp(static_cast<int>(in.tellg())-1);//move the pointer back to the previously read position,so i could write on it 
      if(in.put(ch).fail())//write back,this also move position to the next character to be read/write 
      break;//break on error 

      in.flush(); 
     } 
    } 
} 
関連する問題