我有一个包含以下内容的输入文件:
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 ++中找到另一种方法。
有人有想法吗?
答案 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;