2014-10-31 138 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;将会回应所有的线条。