有没有办法从字符串中提取某些信息? C ++

时间:2019-06-15 02:56:35

标签: c++

我需要从文本文件中读取一些行(运行时将知道行数),但示例可能是这样的:

Forecast.txt:

Day 0:S
Day 3:W
Day 17:N

我的想法是创建一个我做过的课:

class weather
{
  int day;
  char letter;
};

然后按如下方式创建类的向量:

vector<wather>forecast;

现在这是我遇到的问题。所以我想我会使用while循环吗?

id使用我的ifstream读取信息,并使用字符串保存正在读取的信息。

我想做的是在每一行中读取并提取天数,因此在此示例中为0、3和15,并得到字母S,W,N,并将其存储在类的向量中。

我想知道是否有办法做到这一点?我可能会遇到这个错误,因此请原谅我是C ++的新手,并设法弄清楚这一点。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您可以使用std::istringstream来解析每一行,例如:

#include <sstream>

while (getline(in_s1, lines2))
{
    istringstream iss(lines2);
    string ignore1; // "Day" 
    char ignore2; // ":" 
    forecast f;
    if (iss >> ignore1 >> f.day >> ignore2 >> f.letter)
        weather.push_back(f);
}

Live Demo

或者,您可以使用std::regexrelated classes来解析每一行。

答案 1 :(得分:1)

Remy's answer中所述,

istringstream>>运算符可能是最简洁的C ++方法。如果您希望减少对流魔术的依赖,而更加明确一些,则可以find所需的标记,然后直接从字符串中提取它们。

类似这样的东西:

while (getline(in_s1, lines2))
{
    size_t startPos = lines2.find(' '); //get position of the space before the day
    size_t endPos = lines2.find(':', startPos); //get position of the colon after the day
    string day = lines2.substr (startPos+1, endPos-startPos-1); //extract the day

    forecast f;
    f.day = stoi(day); //stoi only supported since C++11, otherwise use atoi
    f.letter = lines2[endPos+1];

    weather.push_back(f);
}