2014-10-31 140 views
0

我是C++初學者,這是學校..getline()不讀取第一行

我想讀一個關於28kb大的文件。該程序的作品,但它不打印前41行。它適用於較小的文件。 起初我正在讀入一個char數組並將其切換爲字符串。 我也試過改變日誌緩衝區,但它顯然應該足夠大.. 我覺得這應該是很簡單的,但只是不能圖出來..

任何幫助將大大apreciated .. 謝謝!

#include <iostream> 
#include <fstream> 
#include <cstdlib> 
#include <string> 
#include <cstdio> 
#include <cerrno> 

using namespace std; 

struct espion 
{ 
    char nom[30]; 
    char pays[20]; 
    char emploi[29]; 

}; 


int main() 
{ 
    const int MAX_NOM = 30, MAX_PAYS = 20, MAX_EMPLOI = 29; 
    char nomFichier[50] = "espion.txt"; 



    ifstream aLire; 
    aLire.open(nomFichier, ios::in|ios::binary); 

    if(!aLire.is_open()){ 
     exit(EXIT_FAILURE); 
    } 


    std::string infoEspion; 


    while(aLire) 
    { 
     infoEspion.clear(); 
     std::getline(aLire, infoEspion); 
     cout << infoEspion ; 

    } 

    aLire.close(); 


    system("pause"); 
    return 0; 

} 
+1

線條有多少個字符?如果它們中的至少一個大於'std :: string :: max_size()',則提取將失敗。 – 0x499602D2 2014-10-31 23:24:31

+1

也許'getline'正常工作,但是當您打印到'cout'時,某些字符會丟失。嘗試爲所有行加上'infoEspion.size()'並查看它是否與文件大小匹配。如果是這樣,比getline可以正確讀取你的輸入。 – pts 2014-10-31 23:31:47

+1

請檢查每個I/O操作(打開,getline,關閉)是否有錯誤,並使錯誤的程序中止。完成後,明確更新您的問題,說明沒有I/O錯誤。 – pts 2014-10-31 23:33:12

回答

0

從系統(「暫停」),它看起來像你在Windows上運行。使用ios :: binary,行結束標記不會被翻譯,並且可以使用infoEspion;語句以這樣的方式打印這些「原始」行,即所有行都被寫在彼此之上。 (更具體地說,每行將以返回結束,但不會換行,因此,在執行每條cout語句後,光標會返回到同一行的開始位置。)如果取出ios :: binary,您將回顯所有輸入一條很長的線。將陳述更改爲cout < < infoEspion < < endl;將會迴應所有的線條。