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 サイトの他の関連記事を参照してください。