在从该位置的文件中找到一行之后,直到该文件的结尾以C++复制。
我有一个文件,其中保存了蛋白质坐标以及前面的其他信息。我的目标是寻找一个名为$PARAMETERS的行,然后从那里复制它后面的每一行,直到文件结束 我怎样才能做到?这是我写的小代码,是其他人几年前写的整个程序的一部分,我负责为我的研究升级他的代码:在从该位置的文件中找到一行之后,直到该文件的结尾以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);
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个不同的数组中,以执行某个循环。那可能吗?谢谢,这绝对是为了我!谢谢所有其他人,他们也尽力帮忙。我考虑到了你的想法,遇到了一些问题,但这一个工作完美无瑕。再次感谢