2012-04-21 158 views
2

我在使用C++讀取文本文件時遇到"\n""\r\n"等問題。在C++中讀取文本文件

int k; 
f>>k; 
string line; 
getline(f,line); 

爲輸入文件的東西,如

1 
abc 

我要放f.get()爲了f>>k後,讀出結束"\n":當我做以下的操作順序中存在的問題。我甚至必須做f.get()兩次,如果我有"\r\n"

如果我將>>getline混合,讀取文件的優雅方式是什麼?

謝謝。

編輯 另外,我不知道是否有任何方便的方式來自動檢測指定的文件有結束的行字符"\n""\r\n"

回答

4

你需要撥弄一點>>getline一起愉快地工作。通常,使用>>運算符從流中讀取某些內容不會丟棄任何後續空白處(換行符)。

解決此問題的常用方法是istream::ignore函數跟在>>之後 - 告訴它放棄所有字符,直至包括下一個換行符。 (只有在你真的想丟棄每一個字符到新行時纔有用)。

例如

#include <iostream> 
#include <string> 
#include <limits> 

int main() 
{ 
    int n; 
    std::string s; 
    std::cout << "type a number: "; 
    std::cin >> n; 
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
    std::cout << "type a string: "; 
    std::getline(std::cin, s); 
    std::cout << s << " " << n << std::endl; 
} 

編輯(我知道你在問題中提到的文件,但希望它不言而喻的std :: CIN是完全互換與ifstream的)

+1

謝謝!請參閱我的編輯:所以如何自動編寫語句'std :: cin.ignore(std :: numeric_limits :: max(),'\ n');'有時候我有'\ r \ n「作爲結尾字符? – 2012-04-21 00:47:50

+0

@QiangLi忽略所有**字符,包括'\ n'字符。這些字符並不重要,在它前面放置一個'\ r'沒有什麼特別之處,所以「\ r \ n」將被視爲與「\ n」或「helloworld \ t \ n」相同的方式。 。 – 2012-04-21 11:09:35

0

完全不同的方法將預 - 使用tr(假設您使用Linux)處理數據文件以刪除\r,然後使用getline()

+0

不,我不想修改輸入文件。 – 2012-04-21 06:18:41