優雅地處理std::istream::getline 中的不同行結尾
讀取文字檔案時,遇到不同的行結尾,例如'n '、'r' 和'rn' 可能會帶來挑戰。 std::getline 是一個從輸入流中檢索行的便捷函數,但它可能會在字串末尾留下殘留的“r”字元。
如 Neil 所指出的,C 運行時通常配備處理基於平台的行結束約定。然而,不同系統之間的互通性需要更強大的方法。
這裡有一個自訂函數,可以無縫處理所有三種行結束類型:
std::istream& safeGetline(std::istream& is, std::string& t) { t.clear(); std::istream::sentry se(is, true); std::streambuf* sb = is.rdbuf(); for(;;) { int c = sb->sbumpc(); switch (c) { case '\n': return is; case '\r': if(sb->sgetc() == '\n') sb->sbumpc(); return is; case std::streambuf::traits_type::eof(): if(t.empty()) is.setstate(std::ios::eofbit); return is; default: t += (char)c; } } }
在此函數中,我們利用Streambuf 物件來高效地一一讀取字符。檢查每個字符,並根據其類型採取適當的操作來處理行結尾。
範例測試程式說明了safeGetline 的用法:
int main() { std::string path = ... // Insert path to test file here std::ifstream ifs(path.c_str()); if(!ifs) { std::cout << "Failed to open the file." << std::endl; return EXIT_FAILURE; } int n = 0; std::string t; while(!safeGetline(ifs, t).eof()) ++n; std::cout << "The file contains " << n << " lines." << std::endl; return EXIT_SUCCESS; }
透過採用這種方法,您可以自信地讀取來自不同來源的文字文件,確保優雅地處理不同的行結尾。
以上是如何優雅地處理 C 的 `std::getline` 中的不同行結尾?的詳細內容。更多資訊請關注PHP中文網其他相關文章!