2016-02-13 84 views
0

在下面的代碼我不能使用std::string類。如何跳過空行不串班

我試圖讀取一個空行的文件,我想,當我遇到他們忽略空行。

我已經測試了用一個簡單的例子,幷包含空行一個虛構的文本文件中的一些想法。

int main() { 
    ifstream fin; 
    fin.open("test.txt"); 
    if(fin.fail()){ 
     cout << "Input file fail."; 
     exit(-1); 
    } 

    char line[10]; 

    while(!fin.eof()){ 
     fin.getline(line, 10); 
     if(line[0] == '\n') 
      cout << "skip" << "\n"; 
     else 
      cout << line << "\n"; 
    } 
} 

我也嘗試之類的東西strlen(line) == 1,但沒有到目前爲止的工作。

什麼問題?

+4

請參閱[爲什麼iostream :: eof在循環條件內被認爲是錯誤的?](http://stackoverflow.com/q/5605125/2069064) – Barry

+0

'std :: getline()'丟棄了分隔符,這解釋了爲什麼你的解決方案都無法運作。 –

+0

*我們不允許使用String類* - 所以還不如叫你的課程* C編程*而不是* C++編程*。 – PaulMcKenzie

回答

1

std::getline()已經負責將'\n'字符(它將被丟棄)的,line[0]將包含'\0'在一個空的輸入的情況下。

只需做比較'\0'而不是'\n'

if(line[0] == '\0') 
    cout << "skip" << "\n"; 
else 
    cout << line << "\n"; 

我也嘗試之類的東西strlen(line) == 1

如果是這樣,不應該已經strlen(line) == 0行?

1

有兩個問題與您的代碼。首先是你的循環不正確。您必須檢查getline()調用的結果,而不是eof()。請參閱Why is iostream::eof inside a loop condition considered wrong。這重組的循環就變成了:

while (fin.getline(line, 10)) { 
    ... 
} 

接下來,當你閱讀getline()線(10似乎真的短了線),分隔符不會是身體的一部分。在閱讀時,line中不會有\n。你只需要一個空字符串。所以丟棄空行的正確方法是:

while (fin.getline(line, 10)) { 
    if (line[0]) { 
     // we have contents! 
    } 
} 

還是真的,std::string只是更好的方式:

std::string line; 
while (std::getline(fin, line)) { 
    if (!line.empty()) { 
     .... 
    } 
} 
0

std::getline()丟棄的分隔符\n。但是您可能還想考慮在某些系統行上可能會被\r\n分隔。

+0

'std :: getline()'也丟棄'\ r \ n'。 –

+0

@πάνταῥεῖ如果您在不同系統之間傳輸文件,是否也是如此? – Zulan