在从该位置的文件中找到一行之后,直到该文件的结尾以C++复制。

在从该位置的文件中找到一行之后,直到该文件的结尾以C++复制。,c++,string,file,copy,C++,String,File,Copy,我有一个文件,其中保存了蛋白质坐标以及前面的其他信息。我的目标是寻找一个名为$PARAMETERS的行,然后从那里复制它后面的每一行,直到文件结束 我怎样才能做到?这是我写的小代码,是其他人几年前写的整个程序的一部分,我负责为我的研究升级他的代码: ifstream InFile; InFile.open (DC_InFile.c_str(), ios::in); while ( not InFile.eof() ) { Line = NextLine (&InFile);

我有一个文件,其中保存了蛋白质坐标以及前面的其他信息。我的目标是寻找一个名为$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;

}

请记住,我将行定义为字符串,我不确定您在复制的文件的第一行上想要什么,但假设您理解得很清楚,并且没有读过当前行以外的内容,您可以像这样复制正在阅读的文件的尾部:

out << InFile.rdbuf();
下面是要将数据发送到的std::ostream


请注意,不应使用infle.eof确定是否有更多数据!相反,您应该阅读您想要阅读的内容,然后检查阅读是否成功。您需要在阅读后进行检查,因为在您阅读之前,流无法知道您正在尝试阅读的内容。

继续了解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();
}
不要放各种复杂的解析信息, 在循环中使用“继续”和“中断”。结果是两者兼而有之 无法阅读和维护。把它分解成一个简单的 功能,如上所述:您也将有更好的机会获得 没错。在您的情况下,是否应该匹配$PARAMETERS 是不是?在一个单独的函数中,它更容易获得
没错。

我想您需要读取$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

. 请你把你的文章格式化好吗?你有什么问题?是的,我理解,我还忘了提到$PARAMETERS行之后,有X,Y,Z坐标写为列。因此,我想将它们转移到3个不同的数组中,以执行某个循环。那可能吗?谢谢,这绝对是为了我!谢谢所有其他人,他们也尽力帮忙。我考虑到了你的想法,遇到了一些问题,但这一个工作完美无瑕。再次感谢