0

次のC++stl構造を使用してファイルを読み込みますvector of characters

std::ifstream testFile(inFileName, std::ios::binary);
std::vector<char> fileContents((std::istreambuf_iterator<char>(testFile)), std::istreambuf_iterator<char>());

しかし、これも\r\nベクトルに読み込まれます。

\r\n読んだ後、読んだり削除したりするのを避ける方法はありますか?

4

2 に答える 2

4

入力ファイルが、それを読んでいるのと同じプラットフォームで生成されていると仮定します。
次に、ファイルをテキストモードで開くだけで、LTS(この場合は'\ r \ n'のようになります)を'\n'に変換できます。

std::ifstream testFile(inFileName);

remove_copyアルゴリズムを使用して、特定の文字を削除できます。

std::vector<char> fileContents;


// Copy all elements that are not '\n'
std::remove_copy(std::istreambuf_iterator<char>(testFile),   // src begin
                 std::istreambuf_iterator<char>(),           // src end
                 std::back_inserter(fileContents),           // dst begin
                '\n');                                       // element to remove

複数のタイプの文字を削除する必要がある場合は、ファンクターを作成してremove_copy_ifアルゴリズムを使用する必要があります。

struct DelNLorCR
{
    bool operator()(char x) const {return x=='\n' || x=='\r';}
};
std::remove_copy_if(std::istreambuf_iterator<char>(testFile),   // src begin
                    std::istreambuf_iterator<char>(),           // src end
                    std::back_inserter(fileContents),           // dst begin
                    DelNLorCR());                               // functor describing bad characters
于 2012-09-10T18:05:08.887 に答える
1

ストリームオブジェクトを作成するときにフラグを渡すios::binaryと、ストリームへの書き込みまたはストリームからの読み取り時に改行や特別なエンコーディングを取得するその他の文字を変換しないようにストリームオブジェクトに指示されます。したがって、バイナリモードで改行を含むファイルを作成すると、システムが改行に使用するものは何でも取得できます。Windowsでは、これは2バイトのシーケンス0x0Aです0x0D。これらの2バイトを表示したくない場合は、ストリームをテキストモードで開きます。つまり、を使用しないでくださいios::binary。これを行うと、1文字の改行が取得されます。

また、テキストファイルの「\ n」文字が、「\r」および「\n」の文字に対応する2バイトとして書き込まれるのは偶然の一致であることに注意してください。0x0Aこれらの文字エスケープと書き込まれるバイトの間に固有の関係はありません。そのため、とを注意深く参照しました0x0D

于 2012-09-10T17:34:18.893 に答える