-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

跟进 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();
}

并且不要将各种复杂的解析信息与continueandbreak放在循环中。结果既不可读也不可维护。把它分解成一个简单的函数,如上所述:你也有更好的机会把它弄好。(在你的情况下,你应该匹配"$PARAMETERS # xxx"还是不匹配?)在一个单独的函数中,更容易让它正确。

于 2012-11-20T18:49:49.167 回答
0

我想您需要在 and 之间读取数据,$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 回答