读取并解析文件的特定部分

时间:2016-12-05 09:19:55

标签: c++

我有一个包含以下内容的输入文件:

Tstart: 13:51:45
Tend: 13:58:00

我想在最后将时间戳放在单独的字符串中。到目前为止,我写了以下内容:

// open the info file
    if (infile.is_open())
    {
        // read the info regarding the played video
        string line;
        while (getline(infile, line))
        {
            istringstream iss(line);
            string token;
            while (iss >> token)
            {
                string tStart = token.substr(0, 6);
                string tEnd = token.substr(7,2);
                cout << tStart << tEnd<< endl;
            }

        }
        infile.close();
    }
    else
        cout << "Video info file cannot be opened. Check the path." << endl;

我得到以下输出:

Tstart
13:51:5
terminate called after throwing an instance of 'std::out_of_range'
  what():  basic_string::substr: __pos (which is 7) > this->size() (which is 5)

我确实理解错误的内容,但我无法在C ++中找到另一种方法。

有人有想法吗?

1 个答案:

答案 0 :(得分:1)

字符串line将是一行文本。首先它将是“Tstart:13:51:45”,并且在下一次迭代中它将是“Tend:13:58:00”。

字符串token将成为以空格分隔的line的一部分。因此,如果line是“Tstart:13:51:45”,则令牌将在第一次迭代中为“Tstart:”,在第二次迭代中为“13:51:45”。这不是你需要的。

我建议使用while搜索空格,然后使用string::find在空格后面搜索所有内容,而不是内部string::substr循环:

bool is_first_line = true;
string tStart, tEnd;

while (getline(infile, line))
{
    int space_index = line.find(' ');

    if (space_index != string::npos)
    {
        if (is_first_line)
            tStart = line.substr(space_index + 1);
        else
            tEnd = line.substr(space_index + 1);
    }

    is_first_line = false;
}

cout << tStart << tEnd << endl;

如果事先不知道哪一行具有哪个值,那么我们仍然可以远离内循环:

string tStart, tEnd;

while (getline(infile, line))
{
    int space_index = line.find(' ');

    if (space_index != string::npos)
    {
        string property_name = line.substr(0, space_index);

        if (property_name == "Tstart:")
            tStart = line.substr(space_index + 1);
        else if (property_name == "Tend:")
            tEnd = line.substr(space_index + 1);
    }
}

cout << tStart << tEnd << endl;