getline方法在嵌套循环中仅工作一次

时间:2019-11-01 18:30:14

标签: c++ input

我正在尝试从两个文件中读取内容,并通过两个循环逐行比较它们。第一个循环逐行通过正确的文件。第二个循环一次打印另一个文件中的所有内容,并将该文件中的每个元素与原始元素进行比较。

我的问题是,我可以使用getline(file,string)在循环的第一遍中读取第二个文件中的行,但是当我尝试再次运行循环时却看不到值。 这是代码:

string userAttempts;
string correctNames;

ifstream nameFile;
nameFile.open("names.txt");

ifstream attemptsFile;
attemptsFile.open("attemptsFile.txt");

while (i < 25)
{
    j = 0;
    i++;
    getline(nameFile, correctNames);
    cout << "Outer: " << i << endl;

    while (j < 10)
    {
        j++;
        getline(attemptsFile, userAttempts);
        cout << userAttempts << endl;


    }
}

输出:

  Outer: 1
  Kid
  John
  Yes
  Time
  Yeet
  this
  hello
  Just Kidding
  Names
  Are
  Outer: 2
  empty

如您所见,外部2为空,这是循环的第二遍。谢谢您的帮助。

1 个答案:

答案 0 :(得分:4)

问题很可能是,一旦您阅读了attemptsFile的所有内容,那么您实际上已经阅读了所有内容。该文件不会自动从头开始重新读取。

如果要执行此操作,则需要再次明确地seek返回文件的第一位置。还是为什么不定义attemptsFile并在外部循环中打开它?

因此循环应如下所示:

for (unsigned i = 0; i < 25 && getline(nameFile, correctNames); ++i)
{
    ifstream attemptsFile("attemptsFile.txt")
    for (unsigned j = 0; j < 10 && getline(attemptsFile, userAttempts); ++j)
    {
        // ...
    }
}

如果要读取文件的所有内容而不是固定的行数,请使用例如

while (getline(nameFile, correctNames))
{
    // ...
}

相反。