0

多くのファイル (.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」を使用するように構成を変更しますが、他の人がそれを見逃す可能性があるため、これに依存したくありません。発生します。

4

1 に答える 1

1

文字列から '\r' 文字を切り取り、空白行を破棄するのがおそらく最も簡単です。std::string をトリミングする方法については、この回答を参照してください (それが「行」であると想定しています)。

std::string をトリムする最良の方法は何ですか?

于 2012-12-19T00:23:56.013 に答える