【问题标题】:Iterating over lines in a string?遍历字符串中的行?
【发布时间】:2011-05-13 10:51:24
【问题描述】:

我正在尝试做这样的事情:

BOOST_FOREACH (const std::string& line, allLinesOf(someFileLoadedIntoString))
{
   ...
}

我想知道如何实现 allLinesOf 函数?谢谢!

更新:感谢您的回答。抱歉,我忘了提及一个重要细节:在我的例子中,换行符是 \r\n。

【问题讨论】:

标签: c++ string boost


【解决方案1】:

您可以使用boost::tokenizer 和\n 标记来遍历行。

【讨论】:

  • 能不能把它打包成一个 allLinesOf 函数?
  • 在某些情况下可能不是一个好主意。看这里:codinghorror.com/blog/2010/01/the-great-newline-schism.html
  • 或 BOOST_FOREACH 与 boost::split 结合使用 :)
  • @Aamir, \n 不一定是0x0A。该标准保证\n 是独立于所用操作系统的行结束。
【解决方案2】:

嗯,您可以为 std::string 编写一个自定义迭代器,该迭代器将迭代由换行符分隔的字符串段,并将这样的迭代器的 std::pair 传递给 BOOST_FOREACH

【讨论】:

    【解决方案3】:

    您可以使用std::getline。

    std::string line;
    while(std::getline(file, line)) {
        // Ohai!
    }
    

    【讨论】:

    • 它可以与“\r\n”换行符一起使用吗?该字符串是从 Windows 上的文本文件加载的。
    • @Alex:你可以从内存中指定一个分隔符,此外,我相信MSVC STL在文本模式下加载时会自动将“\r\n”转换为“\n”。
    • I/O Streams 库执行换行转换,因此当您以文本模式打开文件流时,它会自动将平台行结尾(可能是\r\n 或其他)转换为C++ 行尾 (\n)。
    猜你喜欢
    • 2011-03-04
    • 2012-09-12
    • 1970-01-01
    • 2013-01-05
    • 2018-05-15
    相关资源
    最近更新 更多