std::istream 和 '\r'

std::istream 和 '\r'

 

用std::getline可以从stream中读取一行数据, 默认的行结束符号为'\n'。
最近遇到这样一种情况:使用getline处理有相同text内容的std::ifstream和std::istringstream时,得到的结果有差异。从std::istringstream中返回的一行会多出一个不可见的'\r'符号。

对于用记事本创建的text文件,每一行用\r\n表示。当用std::ifstream读取的时候,std::ifstream内部会处理\r\n为\n,只少从结果上看是这样。当把整个文件读入buffer中,再用std::istringstream处理的时候,\r仍然被保留着。

而\r多数情况下是多余的,因此需要处理掉。新的读取行的函数如下:

std::istream &  readline(std::istream &  stream, std:: string &  szLine)
{
 
using    namespace  std;
 getline(stream, szLine);
 
//  erase '\r'
 szLine.erase(find(szLine.begin(), szLine.end(),  ' \r ' ), szLine.end());
 
//  ignore the empty lines
  if (szLine.empty()  &&  stream)
  readline(stream, szLine);
  
 
return  stream;
}

你可能感兴趣的:(std::istream 和 '\r')