2014-11-03 56 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