-4

タンパク質の座標とその前にある他の情報を保持するファイルがあります。私の目的は、「$ PARAMETERS」という特定の行を探し、そこからファイルの最後まで続くすべての行をコピーすることです。

どうすればそれを行うことができますか?これは私がプログラム全体の一部を書いた小さなコードです(他の誰かが何年も前に書いたもので、私は自分の研究のために彼のコードをアップグレードするために引き継ぎました):

ifstream InFile;
InFile.open (DC_InFile.c_str(), ios::in);

while ( not InFile.eof() )
{
    Line = NextLine (&InFile);

    if (Line.find ("#") == 0) continue;   // skip lines starting with # (comments)
    if (Line.length()   == 0) continue;   // skip empty lines
    size_t pos = Line.find("$PARAMETERS");
    Line.copy(Line.begin("$PARAMETERS")+pos, Line.end("$END"));
    &Line.copy >> x_1 >> y_2 >> z_3;

}

Lineを次のように定義したことを念頭に置いてstring

4

3 に答える 3

0

コピーしたファイルの最初の行に何が必要かわかりませんが、それをまっすぐにして、現在の行を超えて読んでいないと仮定すると、読んでいるfikeの尻尾を次のようにコピーできます。

out << InFile.rdbuf();

これoutstd::ostreamデータの送信先です。

より多くのデータがあるかどうかを判断するために使用するべきではないことに注意してくださいInFile.eof()!代わりに、読みたいものを読んでから、読み取りが成功したことを確認する必要がありますストリームは、読む前に何を読み込もうとしているのかを知ることができないため、読んだ後に確認する必要があります。

于 2012-11-20T18:39:45.053 に答える
0

ファイルの終わりまでではなく、$PARAMETERSとの間のデータを読み取る必要があると思います。その場合は、次のコードを使用できます。$END$PARAMETERS

string str;
while (getline(InFile, str))
{
    if (str.find("#") == 0)
        continue;
    if (str.length() == 0)
        continue;
    if (str.find("$PARAMETERS") == 0)
    {
        double x_1, y_2, z_3; // you want to read numbers, i guess
        while (getline(InFile, str))
        {
            if (str.find("$END") == 0)
                break;
            stringstream stream(str);
            if (stream >> x_1 >> y_2 >> z_3)
            {
                // Do whatever you want with x_1, y_2 and z_3
            }
        }
    }
}

これにより、データの複数のセクションが処理されます。この動作が本当に必要かどうかはわかりません。

例えば:

# comment
$PARAMETERS
1 2 3
4 5 6
$END
#unrelated data
100 200 300
$PARAMETERS
7 8 9
10 11 12
$END
于 2012-11-20T19:28:37.893 に答える
0

Dietmar の回答をフォローアップしstd::getlineます。パターンに一致する行が見つかるまで使用する必要があるように思えます。その行を出力の一部として必要な場合は、それを出力してから、Dietmar のソリューションを使用してファイルの残りをコピーします。何かのようなもの:

while ( std::getline( in, line ) && ! isStartLine( line ) ) {
}
if ( in ) {         //  Since you might not have found the line
    out << line << '\n';    //  If you want the matching line
                            //  You can also edit it here.
    out << in.rdbuf();
}

continueまた、あらゆる種類の複雑な解析情報を、およびbreakを使用してループに入れないでください。結果は判読不能であり、保守も不可能です。上記のように、それを単純な関数に分解します。正しく理解できる可能性も高くなります。(あなたの場合、 に一致させるべき"$PARAMETERS # xxx"かどうか?) 別の関数では、それを正しくする方がはるかに簡単です。

于 2012-11-20T18:49:49.167 に答える