如何使用循环读取未知文件大小?

时间:2014-11-03 20:48:46

标签: c++

所以我有这个问题。

  

“当数据如下所示时,编写一个完整的程序来读取名为”ingolf.txt“的文件中的数据:

     78 78史密斯乔   67 69莫里斯马克
  65 88 Kimball Craig
  ...
  73 75 Dennison David

其中3个点表示更多的数据行“

这是我用来读取文件的循环。

string line;

while(getline(dataFile, line)) {
   dataFile >> round1;
   dataFile >> round2;
   dataFile >> firstName;
   dataFile >> lastName;
   cout << round1 << " ";
   cout << round2 << " ";
   cout << firstName << " ";
   cout << lastName << " ";
}

当我使用此循环时,它会重复上一次文件行两次。难道我做错了什么? 我在此之前使用了eof()并且它工作但我读到这是不好的做法所以我发现这个循环使用了。我也不确定为什么我需要一个变量。该文件的大小未知。我是初学者所以请以noob友好的方式解释:D

2 个答案:

答案 0 :(得分:1)

你应该拥有的是

string line;

while(getline(dataFile, line)) {
    istringstream is(line);

    is >> round1;
    is >> round2;
    is >> firstName;
    is >> lastName;

    // ...
}

在您的示例中getline()已经从输入流中消耗了一行,您将进入循环体,并再次使用

dataFile >> round1;
dataFile >> round2;
dataFile >> firstName;
dataFile >> lastName;

来自输入流(实际上是下一行)。所以你交替扔掉/错过输入线。

答案 1 :(得分:1)

您应该读取一行,然后解析各个字段或直接读入变量。 πάνταῥεῖ发布了一个显示第一个选项的答案,这是第二个选项:

while (dataFile >> round1 >> round2 >> firstName >> lastName) {
    cout << round1 << " ";
    cout << round2 << " ";
    cout << firstName << " ";
    cout << lastName << " ";

    // ...
}

请注意,这将起作用,因为每个字段都以空格分隔。如果字段可以包含空格,则需要使用不同的方法。