我正在从文本文件中读取数据,并使用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());
基于这样的假设,假设存在换行符,相关分隔符将产生最短的“行”。还要考虑到如果它是分隔符,\r
并且将具有相同长度的字符串这一事实\r\n
\r\n