优雅地处理 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中文网其他相关文章!