在 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 中读取文件吗?

C++中,do while, for loop和while loop之间有啥不同

DEV C++读取TAB

C++ 基本 While 循环:未知输入和值增量

从包含混合整数、字母和空格的文件中读取整数 C++

C++ 性能,for 与 while