5

テキスト ファイルからデータを読み込んでいます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

4

0 に答える 0