特に興味がありistream& getline ( istream& is, string& str );
ます。ifstreamコンストラクターに、すべての改行エンコーディングを内部で「\ n」に変換するように指示するオプションはありますか?呼び出してgetline
、すべての行末を適切に処理できるようにしたいと思います。
更新:明確にするために、私はほとんどどこでもコンパイルでき、ほとんどどこからでも入力を受け取るコードを書きたいと思っています。'\ n'のない '\ r'を持つまれなファイルを含みます。ソフトウェアのユーザーの不便を最小限に抑えます。
この問題を回避するのは簡単ですが、すべてのテキストファイル形式を柔軟に処理するための、標準での正しい方法についてはまだ興味があります。
getline
'\ n'までの全行を文字列に読み込みます。'\ n'はストリームから消費されますが、getlineはそれを文字列に含めません。これまでのところ問題ありませんが、文字列に含まれる「\ n」の直前に「\ r」がある可能性があります。
テキストファイルに見られる行末には3つのタイプがあります。「\ n」はUnixマシンでの従来の語尾であり、「\ r」は(私が思うに)古いMacオペレーティングシステムで使用され、Windowsはペア「\ r」を使用します。 '\ n'が続きます。
問題はgetline
、文字列の最後に「\ r」が残ることです。
ifstream f("a_text_file_of_unknown_origin");
string line;
getline(f, line);
if(!f.fail()) { // a non-empty line was read
// BUT, there might be an '\r' at the end now.
}
編集f.good()
私が望んでいたものではないことを指摘してくれたNeilに感謝します。!f.fail()
私が欲しいものです。
自分で手動で削除できます(この質問の編集を参照)。これは、Windowsテキストファイルの場合は簡単です。しかし、誰かが「\ r」だけを含むファイルをフィードするのではないかと心配しています。その場合、getlineは1行だと思って、ファイル全体を消費すると思います。
..そしてそれはUnicodeさえ考慮していません:-)
..おそらく、Boostには、任意のテキストファイルタイプから一度に1行を消費する優れた方法がありますか?
編集私はこれを使用してWindowsファイルを処理していますが、それでもそうする必要はないと感じています。そして、これは「\ r」のみのファイルをフォークしません。
if(!line.empty() && *line.rbegin() == '\r') {
line.erase( line.length()-1, 1);
}