2017-10-19 19 views
1
fstream fs("f.txt", fstream::in | fstream::out | fstream::trunc); 
if(fs) 
{ 
    string str = "45464748"; 
    fs << str; 

    fs.seekg(0, ios::beg); 

    int i = -1; 
    fs >> i; 
    cout << i << endl; 

    fs.seekp(0, ios::beg); 

    i = 0x41424344; 
    fs << i; 

    fs.close(); 
} 

f.txtの内容は「45464748」ですが、内容は「1094861636 "私は理由はありません、私を助けてください。fstream、書き込み、読み取り、書き込みができませんが、最後の書き込みが失敗しました。理由はわかりません。

+0

は 'coutの<< I <<てendlん。' '印刷を45464748'? – SgtDroelf

+0

はい、次の書き込みに失敗しました –

+1

どのコンパイラですか?どのスタンダード(C++ 11、C++ 14、...)?さまざまな場所で異なるビット(eofbit、failbit、badbit)を確認できますか? –

答えて

1

ストリームの状態には、以前の読み取りによって設定されたeofビットがあるため、書き込みは効果がありません。書き込みの前にストリームの状態をクリアします。

void ftest() 
{ 
    std::fstream fs("f.txt", std::fstream::in | std::fstream::out | std::fstream::trunc); 
    if(fs) 
    { 
    std::cout << "A: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    std::string str = "45464748"; 
    fs << str; 
    std::cout << "B: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    fs.seekg(0, std::ios::beg); 
    std::cout << "C: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    int i = -1; 

    // THIS read sets the EOF bit. 
    fs >> i; 

    std::cout << "D: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    std::cout << i << std::endl; 
    fs.seekp(0, std::ios::beg); 
    std::cout << "E: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    i = 0x41424344; 
    std::cout << "F: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    fs << "not written"; 
    fs.clear(); 
    std::cout << "G: " << (fs.eof() ? "eof" : "neof") << std::endl; 
    fs << i; 
    fs.close(); 
    } 
} 

出力:

A: neof 
B: neof 
C: neof 
D: eof 
45464748 
E: eof 
F: eof 
G: neof 

ファイルの内容:

1094861636 
+0

http://www.cplusplus.com/reference/ostream/ostream/seekp/ "コールの前にeofbitフラグが設定されていても機能することに注意してください。しかし、それは変更されません。"そして、ファイルの最後に書き込みが失敗する理由を理解できません! –

+0

あなたが好きなら、seepの前にseekpを実行することができます。これはうまくいきます。しかし、書き込みは機能しません。それが失敗するのは、それらがルールだということです。ostream :: putのドキュメントとostream :: sentryのドキュメントを参照してください。 – Buster

関連する問題