ホームページ >バックエンド開発 >C++ >C で行末が混在しているファイルから行を確実に読み取るにはどうすればよいですか?

C で行末が混在しているファイルから行を確実に読み取るにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-05 17:03:12232ブラウズ

How Can I Reliably Read Lines from a File with Mixed Line Endings in C  ?

std :: ifstream による行末の不一致の克服

テキスト ファイルを操作する場合、行末がプラットフォーム間で異なる可能性があり、互換性が損なわれる可能性があります。問題。通常、C ランタイムは行末を正しく処理しますが、テキスト ファイルがプラットフォーム間で共有されるシナリオを考慮することが重要です。

これに対処するために、3 つの一般的な行末をすべてシームレスに処理するカスタム関数、safeGetline を調べてみましょう。 formats (r, n, and rn):

std::istream& safeGetline(std::istream& is, std::string& t)
{
    // Reset the string to be sure
    t.clear();

    // Utilize a sentry object for synchronized stream access
    std::istream::sentry se(is, true);
    std::streambuf* sb = is.rdbuf();

    while (true)
    {
        // Fetch the next character
        int c = sb->sbumpc();

        switch (c)
        {
            case '\n':
                // Encountered a line ending with just \n
                return is;
            case '\r':
                // Possibility of \r\n line ending
                if (sb->sgetc() == '\n')
                    sb->sbumpc();
                return is;
            case std::streambuf::traits_type::eof():
                // End of file reached
                if (t.empty())
                    is.setstate(std::ios::eofbit);
                return is;
            default:
                // Append the character to the string
                t += (char)c;
        }
    }
}

この関数は、ストリーム バッファーを使用してストリームから文字を 1 つずつ読み取ることによって動作します。これは、入力ストリームから個々の文字を直接読み取ります。これは、さまざまな行末規則を処理し、改行のない空の最終行の可能性も考慮します。

この関数の使用法を示すために、簡単なテスト プログラムを作成しましょう:

int main()
{
    // Specify the path to the text file containing lines with different line endings
    std::string path = ...;

    // Open the file for input
    std::ifstream ifs(path.c_str());
    if (!ifs)
    {
        std::cout << "Error opening the file." << std::endl;
        return EXIT_FAILURE;
    }

    // Count the number of lines in the file
    int n = 0;
    std::string line;
    while (!safeGetline(ifs, line).eof())
        ++n;

    // Display the count of lines
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}

このプログラムは、safeGetline 関数を利用することで、行末形式に関係なく、指定されたテキスト ファイルの行数を正確にカウントできます。

以上がC で行末が混在しているファイルから行を確実に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。