2012-04-18 95 views
2

我應該編寫一個類似於Unix tail函數的小程序,我使用std::deque來存儲我提供的文件中由std::getline讀取的行。在前面推動,從後面彈出。輸出開頭的額外行

我的問題是,當我嘗試打印更多的行然後有文件,它在輸出開始時輸出1多餘的空白行。這裏是源代碼,TParamsstructint lncount所提出的要求的行數進行存儲,並在當前並不重要的東西一些其他的...

using namespace std; 

deque<string> dq; 
int counter = 0; 

for(string line; ! (*infile).eof(); getline(*infile, line)){ 
    dq.push_front(line); 

    // not needed lines dropped immediately 
    if(counter++ >= TParams.lncount) 
     dq.pop_back(); 
} 

int iter = (TParams.lncount > dq.size()) ? 
      (dq.size() - 1) : (TParams.lncount - 1); 

assert(iter < dq.size()); 

for(iter; iter >= 0; iter--) 
    cout << dq[iter] << endl; 

有關於-n +num參數更多的代碼,但它裏面條件並不影響這種情況。

我發現,存在於dq.back()中的實際上是零長度的字符串,但我完全不知道它來自哪裏,因爲它應該是從文件開頭讀取的那個,但是存在正常的文本行。

+0

是否顯示您期望的所有行,或者空行會替換文件中的現有行? – giorashc 2012-04-18 15:30:22

+0

是的,有我期望的一切,加上extraline,詹姆斯Kanze找到了問題,謝謝你的評論 – rivfaader 2012-04-18 15:44:03

回答

7

您的閱讀循環錯誤。首先,(*infile).eof()的值不是 確實指定的;如果你有一個空文件,它仍然可以返回 false。其次,在進入 循環之前,您沒有讀取一行。編寫這樣一個循環的經典方法是:

std::string line; 
while (std::getline(*infile, line)) { 
    // ... 
} 
+0

是的,你是對的,我對C++很陌生,我不太瞭解'std :: getiline'的返回值......我之前對for循環有點擔心,但對於另一個它的運作良好的選項,所以我沒有注意到它...非常感謝 – rivfaader 2012-04-18 15:38:37

0

您檢查eof(這可能是錯誤的檢查)您從流中讀取之前。因此,最後會讀取一個空白,然後在流中設置EOF,但已經太遲了,因爲您已將該額外的行添加到deque

+0

檢查'eof'肯定是錯誤的,但他第一次進入循環時已經關閉,因爲他沒有不做'getline'。 – 2012-04-18 15:33:37