2014-11-03 52 views
-2

所以我有这个问题。如何使用循环读取未知文件大小?

78 78史密斯乔
67个69个莫里斯马克
65 88金博尔克雷格:当数据看起来像这样

“写一个完整的程序来读取文件名为数据‘ingolf.txt’
...
73 75丹尼森大卫

,其中3个点表示数据”

多行

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

string line; 

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

当我使用此循环时,它会重复最后一个文件行两次。难道我做错了什么? 在此之前我使用了eof(),它工作但我读了这是不好的做法,所以我找到了这个循环来代替。我也不确定为什么我需要这个变量。该文件是未知的大小。我是初学者所以请小白友好地解释:d

+0

使用'fscanf'函数,而不是 – 2014-11-03 20:51:10

+2

'而(函数getline(数据文件,行)'看起来不错,到目前为止,可以请你给出一个更完整的[最少的样品(http://stackoverflow.com/help/mcve)这再现了这个问题吗? – 2014-11-03 20:51:48

+2

@MaciejBaranowski为什么这么做?fscanf()优于'getline()',请详细解释! – 2014-11-03 20:53:07

回答

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; 

。所以你会交替输入/丢失的输入行。

+0

谢谢,这工作。 – 2014-11-03 21:17:32

+0

@MenghHer De nada! – 2014-11-03 21:18:58

1

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

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

    // ... 
} 

注意,这将工作,因为每场是空间分隔的。如果一个字段可以包含空格,则需要一个不同的方法。

+0

我一直在更加关注为什么OP的实际实现失败... – 2014-11-03 21:21:33

+0

@πάνταῥεῖ:我喜欢你的回答,以解决发布的代码中的问题,这只是一个替代解决方案。 – Blastfurnace 2014-11-03 21:23:30

+0

当然可以选择其他的解决方案,这就是为什么我已经upvoted你的答案。 – 2014-11-03 21:25:07