std :: getline处理\ n,\ r和\ r \ n

时间:2014-11-20 15:00:38

标签: c++ getline istringstream

我正在从文本文件中读取数据,并使用std::getline逐行读取数据。默认情况下,这会读取换行符\n。我的代码依赖于此。

然而,事实证明我必须处理可能在不同环境中生成的数据,即换行符是\r(Mac),\n(Unix)或\r\n (Windows)中

是否有一个简单的修复程序,以便我可以执行类似

的操作
std::getline(data,str,'\r\n','\r','\n');

但要首先查找\r\n,然后\r\n,以便它返回“'行”。独立于产生它的环境?

或者更一般地说:有没有办法使用std::getline返回“'”行?对于任何类型的常用换行/回车?

目前我想出的就是

std::vector<int> size(3);
for (int i=0;i<3;i++){

    data.open(c_string_file_name);
    switch (i){
        case 0: std::getline(data,str,'\r\n');size[0]=str.size();break;
        case 1: std::getline(data,str,'\r');size[1]=str.size();break;
        case 2: std::getline(data,str,'\n');size[2]=str.size();break;
    }
    data.close();

}

int min=std::min_element(size.begin(),size.end());

std::string delim;

switch (min){
    case 0:delim='\r\n';break;
    case 1:delim='\r';break;
    case 2:delim='\n';break;
}
if ((size[0]==size[1])&&(min==1)){
    delim='\r\n';
}
//rest of code use

std::getline(data,str,delim.c_str());

基于以下假设:假设存在换行符,相关定界符将产生最短的行&#39;。还要考虑\r\r\n如果是\r\n分隔符将具有相同长度字符串的事实

0 个答案:

没有答案