在 C++ 中读取文件:for 和 while 嵌套循环没有按预期工作:串行?
Posted
技术标签:
【中文标题】在 C++ 中读取文件:for 和 while 嵌套循环没有按预期工作:串行?【英文标题】:file reading in c++: for and while nested loop are not working as expected: serially? 【发布时间】:2015-03-31 12:07:19 【问题描述】:我希望嵌套的 for 循环以串行顺序工作,例如考虑以下代码:
int main ()
string mainstr;
ifstream infile;
ifstream infile1;
infile.open ("27032015.log");
infile1.open("Exordernumber");
for (unsigned int curLine = 0; getline(infile1,exordernum); curLine++)
cout << "curLine:" << curLine << endl;
for (unsigned int curLine1 = 0; getline(infile,mainstr);curLine1++)
cout << "curLine1:" << curLine1 << endl;
if (mainstr.find(exordernum) != std::string::npos)
cout << "exordernum:"<<exordernum << ":" << endl;
我希望它首先打印 curLine: 1 然后 curLine1: 所有值 然后是 curLine: 2 然后 curLine1: 所有值 然后是 curLine: 3 然后 curLine1: 所有值
等等..
但它打印的东西: 曲线:1 然后 curLine1: 所有值 曲线:2 曲线:3 曲线:4
等等..
错在哪里? 即使我使用 while 循环,也会打印相同的内容。 我无法弄清楚问题所在。
现在问题已经解决了,我想知道同一件事的python代码: 这是我写的,它给出了一个错误。
#!/usr/bin/env python
import sys
import re
hand = open('Exordernumber')
for line1 in hand:
with open('27032015.log') as f:
for line in f:
if re.search(line,line1):
print line
f.close()
请推荐正确的python代码。
【问题讨论】:
【参考方案1】:您必须在每次外部迭代后将 infile 流重置为流的开头。我想你需要这样的东西
for (unsigned int curLine = 0; getline(infile1,exordernum); curLine++)
cout << "curLine:" << curLine << endl;
for (unsigned int curLine1 = 0; getline(infile,mainstr);curLine1++)
cout << "curLine1:" << curLine1 << endl;
if (mainstr.find(exordernum) != std::string::npos)
cout << "exordernum:"<<exordernum << ":" << endl;
infile.seekg (0, infile.beg);
【讨论】:
【参考方案2】:第一次进入文件“27032015.log”的末尾。 第二次你永远不会去循环:
for (unsigned int curLine1 = 0; getline(infile,mainstr);curLine1++)
cout << "curLine1:" << curLine1 << endl;
您必须将光标定位到文件的开头或在循环结束时重新打开它。
int main ()
string mainstr;
ifstream infile;
ifstream infile1;
infile.open ("27032015.log");
infile1.open("Exordernumber");
for (unsigned int curLine = 0; getline(infile1,exordernum); curLine++)
cout << "curLine:" << curLine << endl;
for (unsigned int curLine1 = 0; getline(infile,mainstr);curLine1++)
cout << "curLine1:" << curLine1 << endl;
if (mainstr.find(exordernum) != std::string::npos)
cout << "exordernum:"<<exordernum << ":" << endl;
infile.seekg (0, infile.beg);
http://www.cplusplus.com/reference/istream/istream/seekg/
【讨论】:
【参考方案3】:内部循环只进入一次,因为在第一次迭代文件后,该循环的条件“getline(infile, mainstr)”永远不会满足。文件中的指针始终指向文件末尾。
你可以做的是在外循环中打开文件:
for (unsigned int curLine = 0; getline(infile1,exordernum); curLine++)
cout << "curLine:" << curLine << endl;
infile.open ("27032015.log");
for (unsigned int curLine1 = 0; getline(infile,mainstr);curLine1++)
cout << "curLine1:" << curLine1 << endl;
if (mainstr.find(exordernum) != std::string::npos)
cout << "exordernum:"<<exordernum << ":" << endl;
infile.close ();
所以每次进入内循环之前都会重新初始化输入文件。
对于python代码,您可以尝试删除最后一行'f.close()'。当您使用“with open”时,python 将为您处理文件关闭。但是你需要手动关闭文件'hand'。
#!/usr/bin/env python
import sys
import re
hand = open('Exordernumber')
for line1 in hand:
with open('27032015.log') as f:
for line in f:
if re.search(line,line1):
print line
hand.close()
你能贴出python代码的错误信息吗?
【讨论】:
做了同样的事情,工作正常。我想知道 python 代码会是什么样子,因为它需要很长时间。以上是关于在 C++ 中读取文件:for 和 while 嵌套循环没有按预期工作:串行?的主要内容,如果未能解决你的问题,请参考以下文章
可以使用 while(file >> ...) C++ 习语在 Cython 中读取文件吗?