c ++从ifstream

时间:2016-05-23 11:45:12

标签: c++

我正在从一个文件中读取一个表格,如下所示:

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",它不必有空格。

2 个答案:

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