我正在从一个文件中读取一个表格,如下所示:
80 Sunny false 90 Play
75 Rainy true 88 Don't play
...
我使用ifstream(),事情是我需要最后一列的值(播放/不播放)来初始化每个先前的变量。那么有没有办法先获取一行的最后一个元素,然后我可以从头开始读取其他元素?或者,有没有办法从后面读取一行?
Edit0: 所以我所做的是读取整行以获取最后一个变量,然后遍历所有先前的变量来初始化它们。但是,这使得性能受到很大影响。所以我正在寻求更快的方法来做到这一点。
EDIT1: 因此每个变量都存储为一个结构,该结构也包含最后一个变量。读完第一行后,我会得到一系列结构:
(80,Play) (Sunny,Play) (false,Play) (90,Play)
为了初始化这些结构(或设置它们的第二个值),我需要知道最后一个变量。
编辑2:抱歉,我忘了添加#34;不要玩#34;也可以是" Don&#t; t",它不必有空格。
答案 0 :(得分:4)
读取一个整数,一个字符串,一个布尔值和另一个整数,然后将它们全部扔掉并使用std::getline
读取该行的其余部分。
编辑后。
您不需要最后一部分(“播放”/“不播放”字符串)来创建四种不同的结构,您可以创建并部分初始化它们,然后读取最后一部分并完成结构初始化
因此,正常阅读前四个条目,但将保存到您拥有的结构中。然后使用std::getline
读取“播放”/“不播放”字符串,并使用它来完成结构的初始化。
为了更加安全,您可以先使用std::getline
将整行读入字符串,将字符串放入std::istringstream
并从字符串流中读取每个元素。
答案 1 :(得分:1)
您可以使用此类解决方案读取行的最后一个元素:
std::string last_line_word_1(std::istream& in)
{
std::string line;
std::getline(in, line);
std::size_t last_pos = line.find_last_of(' ');
if(last_pos == std::string::npos)
last_pos = 0;
else
++last_pos;
return line.substr(last_pos, line.length() - last_pos);
}
std::string last_line_word_2(std::istream& in)
{
std::string line;
std::getline(in, line);
std::reverse(line.begin(), line.end());
std::istringstream iss(line);
std::string word;
iss >> word;
std::reverse(word.begin(), word.end());
return word;
}