4

指定されたファイル内の行を探して、自分の行に置き換えようとしています。これを実行するマシンのライブラリにアクセスできないため、カスタム ファイルを作成しました。問題は、fstream オブジェクトへの書き込み呼び出しにあるようです。あなたの誰かが助けてくれるかどうか疑問に思っていました。また、ファイルの最後に到達する前に getline ループが停止しますが、その理由がわかりません。

#include <iostream>
#include <fstream>
#include <string>

#define TARGET2 "Hi"

using namespace std;

void changeFile(string fileName){
    fstream myStream;
    myStream.open(fileName.c_str(),fstream::in | fstream::out);     

    string temp;
    string temp2 = "I like deep dish pizza";    

    while(getline(myStream, temp)){
        if(temp == TARGET2){
            cout << "Match" << endl;
            myStream.write(temp2.c_str(), 100);
            myStream << temp2 << endl;
            cout << "No runtime error: " << temp2 << endl;                  
        }
        cout << temp << endl;
    }
    myStream.close();
}

int main (void){        
    changeFile("Hi.txt");
    return 0;
}

こんにちは.txt

Hi
Today is June 18
I like pizza
I like pepperoni

出力は次のとおりです。

Match
No runtime error: I like deep dish pizza
Hi
4

1 に答える 1

6
myStream.write(temp2.c_str(), 100);
myStream << temp2 << endl;

なぜこれをファイルに 2 回書き込んでいるのですか? また、なぜ「I like deep dish pizza」が 100 文字の長さであると言っているのですか? 2行目を単独で使用するだけで、必要なことができます。

ループが終了する理由は、ファイルを読みながら書き込んでいるためだと思います。これによりgetline、混乱が生じます。ファイルが小さい場合は、すべてを に読み込んでstringstream、置き換えたい行を置き換えてから、全体stringstreamをファイルに書き出します。ファイルをその場で変更するのははるかに困難です。

例:

#include <fstream>
#include <iostream>
#include <sstream>

int main(int argc, char** argv) {

    /* Accept filename, target and replacement string from arguments for a more
       useful example. */
    if (argc != 4) {
        std::cout << argv[0] << " [file] [target string] [replacement string]\n"
            << "    Replaces [target string] with [replacement string] in [file]" << std::endl;
        return 1;
    }

    /* Give these arguments more meaningful names. */
    const char* filename = argv[1];
    std::string target(argv[2]);
    std::string replacement(argv[3]);

    /* Read the whole file into a stringstream. */
    std::stringstream buffer;
    std::fstream file(filename, std::fstream::in);
    for (std::string line; getline(file, line); ) {
        /* Do the replacement while we read the file. */
        if (line == target) {
            buffer << replacement;
        } else {
            buffer << line;
        }
        buffer << std::endl;
    }
    file.close();

    /* Write the whole stringstream back to the file */
    file.open(filename, std::fstream::out);
    file << buffer.str();
    file.close();
}

次のように実行します。

g++ example.cpp -o example
./example Hi.txt Hi 'I like deep dish pizza'
于 2013-06-18T17:29:14.227 に答える