2

次のようなtxtファイルがあります。

"shoes":12
"pants":33
"jacket":26
"glasses":16
"t-shirt":182

ジャケットの数を (たとえば 26 から 42 に) 交換する必要があります。だから、私はこのコードを書きましたが、「ジャケット」という単語がある特定の行を編集する方法がわかりません:

#include <iostream>
#include <fstream> 

using namespace std;

int main() {

    ifstream f("file.txt");
    string s;

    if(!f) {
        cout< <"file does not exist!";
        return -1;
    }

    while(f.good()) 
    {       
        getline(f, s);
        // if there is the "jacket" in this row, then replace 26 with 42.
    }


    f.close(); 
    return 0;
}
4

2 に答える 2

3

テキストファイルのデータを変更するには、通常、ファイル全体をメモリに読み込み、そこで変更を加えてから、書き換える必要があります。この場合、エントリの構造を定義し、エントリを使用してnamequantity名前の同等性として定義された同等性、およびオーバーロードoperator>>operator<<れたファイルからの読み取りと書き込みを行うことをお勧めします。全体的なロジックは、次のような関数を使用します。

void
readData( std::string const& filename, std::vector<Entry>& dest )
{
    std::ifstream in( filename.c_str() );
    if ( !in.is_open() ) {
        //  Error handling...
    }
    dest.insert( dest.end(),
                 std::istream_iterator<Entry>( in ),
                 std::istream_iterator<Entry>() );
}

void
writeData( std::string const& filename, std::vector<Entry> const& data )
{
    std::ifstream out( (filename + ".bak").c_str() );
    if ( !out.is_open() ) {
        //  Error handling...
    }
    std::copy( data.begin(), data.end(), std::ostream_iterator<Entry>( out ) );
    out.close();
    if (! out ) {
        //  Error handling...
    }
    unlink( filename.c_str() );
    rename( (filename + ".bak").c_str(), filename.c_str() );
}

(エラー処理で例外を発生させることをお勧めします。そうすれば、sのelseブランチについて心配する必要がなくなりますif。最初のでの作成を除いてifstream、エラー条件は例外的です。)

于 2012-04-19T10:31:18.800 に答える
0

まず第一に、これは素朴な方法では不可能です。上記の行を編集したいが、より大きな数値を書き込んだとします。ファイルにスペースはありません。したがって、通常、途中のeidtは、ファイルを書き換えるか、コピーを書き込むことによって実行されます。プログラムはメモリや一時ファイルなどを使用し、これをユーザーから隠すことができますが、ファイルの途中で一部のバイトを変更すると、非常に制限された環境でのみ機能します。

だからあなたがしたいのは別のファイルを書くことです。

...
string line;
string repl = "jacket";
int newNumber = 42;
getline(f, line)
if (line.find(repl) != string::npos)
{
    osstringstream os;
    os << repl  << ':' << newNumber;
    line = os.str();
}
// write line to the new file. For exmaple by using an fstream.
...

ファイルが同じである必要がある場合は、十分なメモリがある場合はすべての行をメモリに読み取るか、入力または出力のいずれかに一時ファイルを使用できます。

于 2012-04-19T10:20:24.780 に答える