使用c ++逐行读取字符串

时间:2011-02-20 18:30:21

标签: c++

我有一个std::string多行,我需要逐行阅读。 请用一个小例子告诉我如何做到这一点。

例如:我有一个字符串string h;

h将是:

Hello there.
How are you today?
I am fine, thank you.

我需要以某种方式提取Hello there.How are you today?I am fine, thank you.

5 个答案:

答案 0 :(得分:60)

#include <sstream>
#include <iostream>

int main() {
    std::istringstream f("line1\nline2\nline3");
    std::string line;    
    while (std::getline(f, line)) {
        std::cout << line << std::endl;
    }
}

答案 1 :(得分:10)

有几种方法可以做到这一点。

您可以在std::string::find字符循环中使用'\n',并在位置之间使用substr()。

您可以使用std::istringstreamstd::getline( istr, line )(可能是最简单的)

您可以使用boost::tokenize

答案 2 :(得分:4)

答案 3 :(得分:0)

如果您不想使用流:

int main() {
  string out = "line1\nline2\nline3";
  size_t start = 0;
  size_t end;
  while (1) {
    string this_line;
    if ((end = out.find("\n", start)) == string::npos) {
      if (!(this_line = out.substr(start)).empty()) {
        printf("%s\n", this_line.c_str());
      }

      break;
    }

    this_line = out.substr(start, end - start);
    printf("%s\n", this_line.c_str());
    start = end + 1;
  }
}

答案 4 :(得分:0)

我一直在寻找一种可以从字符串返回特定行的函数的标准实现。我遇到了这个问题,接受的答案非常有用。我也想分享自己的实现:

// CODE: A
std::string getLine(const std::string& str, int line)
{
    size_t pos = 0;
    if (line < 0)
        return std::string();

    while ((line-- > 0) and (pos < str.length()))
        pos = str.find("\n", pos) + 1;
    if (pos >= str.length())
        return std::string();
    size_t end = str.find("\n", pos);
    return str.substr(pos, (end == std::string::npos ? std::string::npos : (end - pos + 1)));
}

但是我已将我自己的实现替换为接受的答案中所示的实现,因为它使用的是标准功能,并且不易出错。.

// CODE: B
std::string getLine(const std::string& str, int lineNo)
{
    std::string line;
    std::istringstream stream(str);
    while (lineNo-- >= 0)
        std::getline(stream, line);
    return line;
}

两个实现之间存在行为差异。 CODE: B从返回的每一行中删除换行符。 CODE: A不会删除换行符。

我打算发布我对这个不活跃问题的答案的目的是让其他人看到可能的实现。

注意:

我不想进行任何优化,而是想在Hackathon中执行给我的任务!