ホームページ > バックエンド開発 > C++ > `std::ifstream` を使用して C で混合改行規則を確実に処理するにはどうすればよいですか?

`std::ifstream` を使用して C で混合改行規則を確実に処理するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-06 16:39:18
オリジナル
751 人が閲覧しました

How Can I Reliably Handle Mixed Newline Conventions in C   Using `std::ifstream`?

std::ifstream によるさまざまな改行規則の処理

C ランタイムは通常、プラットフォームに基づいて改行規則を処理しますが、場合によってはさまざまな改行形式を含むテキスト ファイルを均一に処理する必要があります。この記事では、std::ifstream を使用してこれを実現する方法について説明します。

問題

getline(istream&, string&) は、終了をマークする 'n' 文字を期待しています。ただし、テキスト ファイルには、「r」、「n」、またはその両方がさまざまな組み合わせで含まれる場合があります。 「r」文字が「n」の前にある場合、取得された行にその文字が含まれる可能性があり、不一致が発生します。

解決策

ifstream コンストラクターを使用して、さまざまな改行エンコーディングを「n」に直接変換します。ただし、この状況を処理するカスタム関数を作成できます。

std::istream& safeGetline(std::istream& is, std::string& t)
{
    // ... Implementation here (see below) ...
}
ログイン後にコピー

実装の詳細

safeGetline 関数は、streambuf を利用して文字を 1 つずつ読み取ります。 std::istream を直接使用するよりも効率が高くなります。ストリームを反復処理して、さまざまな改行規則を処理します。

  • 'n': 行を返します。
  • 'r': 次の文字が 'n' かどうかを確認し、次の場合は先に進みます。真実。次に、その行を返します。
  • std::streambuf::traits_type::eof(): 行が改行で終わっていない場合、ストリームを eof 状態に設定します。
  • その他文字: 文字列に文字を追加します。

テストプログラム

サンプル テスト プログラムは、safeGetline 関数の使用法を示します。

int main()
{
    // Open a file and check for errors.

    int n = 0;
    std::string t;
    while (!safeGetline(ifs, t).eof())
        ++n;
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}
ログイン後にコピー

結論

safeGetline 関数を使用すると、手動による改行処理の必要がなく、異なる改行規則間でも一貫した行取得が保証されます。このアプローチは、さまざまなソースから作成されたテキスト ファイルを処理するための堅牢かつ柔軟なソリューションを提供します。

以上が`std::ifstream` を使用して C で混合改行規則を確実に処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート