c++从ifstream中读取一行的最后一个变量

c++ read the last variable of a line from ifstream

本文关键字:一行 最后一个 变量 ifstream 读取 c++      更新时间:2023-10-16

我正在从如下文件中读取一个表:

80 Sunny false 90 Play
75 Rainy true 88 Don't play
...

我使用ifstream(),问题是我需要最后一列的值(播放/不播放)来初始化前面的每个变量。那么,有没有一种方法可以先得到一行的最后一个元素,然后我可以从头开始读取其他元素?或者,有没有一种方法可以从后面读一行?

第0版:因此,我所做的是读取整行内容,以获得最后一个变量,然后循环遍历之前的所有变量来初始化它们。然而,这使性能受到很大影响。所以我正在寻找一种更快的方法

第1版:因此,每个变量都存储为一个结构,该结构还包含最后一个变量。在阅读了第一行之后,我将得到这样的结构数组:

(80,Play) (Sunny,Play) (false,Play) (90,Play)

为了初始化这些结构(或设置它们的第二个值),我需要知道最后一个变量。

第二版:很抱歉,我忘了加上"不要玩"也可以是"不玩",它不必有空格。

读取一个整数、一个字符串、一个布尔值和另一个整数,然后将它们全部丢弃,并使用std::getline读取行的其余部分。


编辑后

你不需要最后一部分("播放"/"不播放"字符串)来创建四个不同的结构,你可以创建并部分初始化它们,然后读取最后一部分并完成结构初始化。

因此,正常读取前四个条目,但将它们保存到现有结构中。然后使用std::getline读取"播放"/"不播放"字符串,并使用该字符串完成结构的初始化。

为了更安全起见,您可以首先使用std::getline将整行读取到字符串中,将字符串放入std::istringstream中,然后从字符串流中读取每个元素。

您可以用这种解决方案读取一行的最后一个元素:

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;
}