首页 > 后端开发 > C++ > 如何优雅地处理 C 的 `std::getline` 中的不同行结尾?

如何优雅地处理 C 的 `std::getline` 中的不同行结尾?

Patricia Arquette
发布: 2024-12-08 07:59:10
原创
798 人浏览过

How to Gracefully Handle Different Line Endings in C  's `std::getline`?

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板