与eof和哨兵一起使用

时间:2016-10-30 17:12:07

标签: c++

我正在读取一个文件,并在此.dat文件中间有一个标记。第一部分是变量和它们要分配的值。我得到变量,它们的价值很好。这就是我所拥有的。

int main() {
ifstream infile;
string variable;
int value;

infile.open("test.dat");

while (infile.peek() != EOF) {

    infile >> variable;
    infile >> value;

}



return 0;
}

这是.dat文件

f 32
h 3
l -2
q 3
v 5
$
lqv
hfv
vvf
vfl

我的第一个想法是使用while循环。那是while (variable != "$"),但是当我这样做时,我会陷入无限循环。所以我完全迷失了如何获取和分配变量,然后获取.dat文件的其余部分。

由于我不想对变量进行硬编码这一事实,我不得不稍微改变一下。我将使用2个循环。一个在$之前,一个在$之后。当我尝试while (infile != "$")时,我得到一个无限循环。

3 个答案:

答案 0 :(得分:1)

我建议如下,读取第一个变量名称,如果需要,请读取值:

while (infile >> variable)
{
  if (variable != "$")
  {
    infile >> value;
  }
  else
  {
    break;
  }
}

std::map变量名与值相关联非常有用:

std::map<std::string, double> dictionary;
while (infile >> variable)
{
  if (variable != "$")
  {
    infile >> value;
    dictionary[variable] = value;
  }
  else
  {
    break;
  }
}

语法infile >> variable是一种从文件中读取的更可靠的方法。

答案 1 :(得分:0)

您可以替换

while (infile.peek() != EOF) {
    infile >> variable;
    infile >> value;
    ...
}

通过

while (infile.good()) {
    infile >> variable;
    if (variable != "$" && variable.length() > 0) {
        infile >> value;
        switch (variable[0]) {
            ...
        }
    }
    else
        break;
}

这应避免无限循环。

答案 2 :(得分:0)

您可以检查下一个字母是否是&#39; $&#39;或EOF,但在&#34;&gt;&gt;&#34;你需要为\ n。

添加一个get
    ifstream file("test.dat");
    int value;
    string variable;
    while(file.peek() != '$')
    {
            file >> variable;
            file >> value;
            while(file.get() != '\n' && file.good()); // '\n'
            if(!file.good()) break;
    }

这只有在你真正知道文件的结构时才有效,否则你应该阅读行并扫描你需要的内容。

相关问题