在遍历字符串时尝试访问子字符串的编译器错误

时间:2012-11-16 21:56:04

标签: c++ string stl iterator

我徒劳地试图找到解析存储在string对象中的文本文件的方法。字符串的格式如下:

...
1  45
1  46
1  47
2  43
2  44
2  45
...

我试图迭代整个字符串,抓住每一行,然后用第一个整数和第二个整数拆分字符串以进行进一步处理。但是,做这样的事情是行不通的:

string  fileContents;

string::iterator index;

for(index = fileContents.begin(); index != fileContents.end(); ++index)
{
   cout << (*index);       // this works as expected

   // grab a substring representing one line of the file
   string temp = (*index); // error: trying to assign const char to const char*
}

我正试图找到一种方法来做到这一点,但到目前为止我还没有运气。

2 个答案:

答案 0 :(得分:4)

使用istringstreamstd::getline()获取每行的整数:

#include <iostream>
#include <sstream>
#include <string>

int main()
{
    std::istringstream in("1 45\n1 47\n");
    std::string line;
    while (std::getline(in, line))
    {
        std::istringstream nums(line);
        int i1, i2;
        if (nums >> i1 && nums >> i2)
        {
            std::cout << i1 << ", " << i2 << "\n";
        }
    }
    return 0;
}

请参阅http://ideone.com/mFmynj上的演示。

答案 1 :(得分:0)

std::string::iterator标识charchar可能用于形成一个元素std::string,但这可能不是您想要的。相反,您可以使用两个迭代器来创建std::string,例如:

for (std::string::const_iterator begin(s.begin()), it(begin), end(s.end());
     end != (it = std::find(it, end, '\n'); begin = ++it) {
    std::string line(begin, it);
    // do something with the line
}

如前所述,使用从std::string创建的流可能更容易使用流功能。