2012-04-21 120 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