0

次のコードは、1 つの例外を除いて、想定されていることを正確に実行します。変更されたバッファーの内容がファイルに保存されていません。コードをステップ実行したところ、バッファが変更されているのがわかるので、何が起こっているのかわかりません。コメントをいただければ幸いです。

bool replacestring(char *ifile, wstring& searchString, wstring& replacementString)
{
    wstring buffer;
    wifstream finout(ifile, ios_base::in | ios_base::out | ios_base::binary);

if(!finout.is_open())
{
    cout << "Can not open file " << endl;
    return(1);
}
while(getline(finout,buffer))
{
    auto pos = buffer.find( searchString ) ;
    while( pos != std::string::npos )
    {
        buffer.replace( pos, searchString.size(), replacementString ) ;
        pos = buffer.find( searchString, pos + replacementString.size() ) ;
    }
    if(finout.bad())
        perror("BAD READ");
}
finout.close();
return 0;
}
4

1 に答える 1

2

ストリームからバッファにデータをコピーした後、そのバッファはストリームから分離され、バッファに加えられた変更はストリームに反映されません。

ifstreamwifstreamは入力ストリームであり、出力ストリームではありません。

filebufまたはwfilebuf代わりにあなたが望むものかもしれません。

またはBoost.Iostreams

ofstreamまたはを使用して 2 番目のファイルに書き込む方が簡単な場合がありますwofstream。これにより、既存のファイルが破壊されるリスクも回避できます。

同様の質問:

于 2013-05-05T13:12:02.843 に答える