多くのファイル (.tar のようなもの) をパックしたバイナリ ファイルがあり、バイナリ ファイルとテキスト ファイルの両方を見つけることができます。
メモリ文字列で処理する場合、キャリッジ行は通常'\n'ですが、この圧縮ファイルからテキスト部分を読み取ると、"\r\n"が得られます。したがって、このテキストを処理するとエラーが発生します。
バイナリ ファイルからテキストを読み取るためのコードを次に示します。
FILE* _fileDescriptor; // it's always open to improve performance
fopen_s(&_fileDescriptor, _filePath.string().c_str(), "rb");
char* data = new char[size + 1]; // size is a known and correct value
fseek(_fileDescriptor, begin, SEEK_SET); // begin is another known value, where the file starts inside the packed one
fread(data, sizeof(char), size, _fileDescriptor);
data[it->second.size] = '\0';
これにより、 dataに正しいテキストが返されますが、次のコードでは、空の行を読み取るときにエラーが発生します。
istringstream ss(data); // create a stringstream to process it in another function
delete[] data; // free the data buffer
// start processing the file
string line;
getline(infile, line); // read an empty line
if(line.size() > 0) {
/*
enters here, because the "empty" line was "\r\n", and now the value of line is '\r', therefore line.size() == 1
*/
...
それで、「\ r」を避けるためのアドバイスはありますか?
メモ帳++で編集しました。行キャリッジが機能するため、「\r\n」の代わりに「\n」を使用するように構成を変更しますが、他の人がそれを見逃す可能性があるため、これに依存したくありません。発生します。