特に私はistream& getline (istream& is, string& str);
に興味があります。 ifstreamコンストラクタに、改行コードをすべて\ nに変換するように指示するオプションがありますか?私はgetline
に電話して、すべての行末を正常に処理したいと思っています。LF、CR、およびCRLFを処理するためにstd :: ifstreamを取得しますか?
アップデート:わかりやすくするために、ほぼどこでもコンパイルできるコードを書くことができるようにしたいと考えています。 '\ r'に '\ n'を含まない珍しいファイルを含める。ソフトウェアのユーザーにとっての不便さを最小限に抑えます。
問題を回避するのは簡単ですが、標準では、すべてのテキストファイル形式を柔軟に処理するための正しい方法についてはまだ興味があります。
は、フルラインで「\ n」までを文字列にして読み込みます。 '\ n'はストリームから消費されますが、getlineはそれを文字列に含めません。これまでは問題ありませんが、文字列に '\ n'の直前に '\ r'が含まれている可能性があります。
テキストファイルには があります。 '\ 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()
は私が望んでいないことを指摘してニールに感謝します。 !f.fail()
は私が欲しいものです。
Windowsのテキストファイルで簡単に手動で削除できます(この質問の編集を参照)。しかし、私は誰かが '\ r'だけを含むファイルをフィードすることに心配しています。その場合、私はgetlineがファイル全体を1行であると考えて消費することを想定しています!
...それも:-)
ユニコードを考慮していないが...多分ブーストは、任意のテキストファイルの種類から1行ずつ消費する良い方法を持っていますか?
私はこれを使ってWindowsファイルを処理していますそして、これは '\ r'専用のファイルではフォークしません。
if(!line.empty() && *line.rbegin() == '\r') {
line.erase(line.length()-1, 1);
}
\ nは、現在のOSでどのように表示されていても、新しい行を意味します。図書館はそれを世話します。しかし、それが動作するためには、ウィンドウでコンパイルされたプログラムは、ウィンドウからテキストファイル、Unixでコンパイルされたプログラム、UNIXなどのテキストファイルを読み込む必要があります。 –
@George、Linuxマシンでコンパイルしていますが、元々はWindowsマシンから来たテキストファイルです。私はソフトウェア(ネットワーク解析のための小さなツール)をリリースするかもしれません、そして、私は彼らが(ASCIIのような)テキストファイルのほぼいつでもフィードできることをユーザーに伝えたいと思います。 –
[あなたの問題を示す小さなテストケース](http://ideone.com/FanD7)。 –