Я читаю данные из текстового файла и делаю это построчно, используя 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
.
std::getline
преобразует'\n'
в новую строку для конкретной системы. - person chris   schedule 20.11.2014std::getline(data,str,'\r')
. В этом случае он не делает то, что вы говорите. - person user3353819   schedule 20.11.2014\r
, он найдет его, даже если фактически используемый символ разрыва строки\r\n
- person user3353819   schedule 20.11.2014