首页 > 解决方案 > getline 方法仅在嵌套循环中工作一次

问题描述

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

我的问题是我能够使用 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 为空,这是第二次通过循环。谢谢您的帮助。

标签: c++input

解决方案


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

如果你想这样做,你需要再次明确地回到文件的第一个位置。或者为什么不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))
{
    // ...
}

反而。


推荐阅读