讓std :: ifstream處理LF,CR和CRLF?具體來說我很感興趣istream& getline ( istream& is, string& str );。是否有ifstream構造函數的選項告訴它將所有換行編碼轉換為引擎蓋下的'\ n'?我希望能夠打電話getline并優雅地處理所有行結尾。更新:為了澄清,我希望能夠編寫幾乎可以在任何地方編譯的代碼,并且幾乎可以從任何地方獲取輸入。包括'\ r'沒有'\ n'的稀有文件。最大限度地減少軟件用戶的不便。解決這個問題很容易,但我仍然對標準中正確處理所有文本文件格式的方式感到好奇。getline讀取一個完整的行,直到'\ 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.}編輯感謝Neil指出這f.good()不是我想要的。!f.fail()是我想要的。我可以自己手動刪除它(請參閱此問題的編輯),這對于Windows文本文件很容易。但是我擔心有人會輸入一個只包含'\ r'的文件。在這種情況下,我認為getline將消耗整個文件,認為它是一行!..那甚至不考慮Unicode :-)..也許Boost有一種很好的方式從任何文本文件類型一次消耗一行?編輯我正在使用它來處理Windows文件,但我仍然覺得我不應該這樣做!這不會為'\ r'專用文件分叉。if(!line.empty() && *line.rbegin() == '\r') {
line.erase( line.length()-1, 1);}
- 3 回答
- 0 關注
- 760 瀏覽
添加回答
舉報
0/150
提交
取消