1

我目前正在做一个项目,我需要实现几个类来模拟自助餐厅。每个在线等待取餐的“学生”都有 5 个变量来描述他们,即:姓名、组别、主菜类型、零食/甜点类型,以及一个代表他们计划购买的沙拉数量(以盎司为单位)的数字。这个想法是,所有这些信息都将使用 fstream 从文本文件中读取(大纲遵循特定顺序并为每个学生重复)。读完每个学生后,我将学生推到队列中,以模拟他们排队等候。

我的问题是两件事,首先,当使用getline()函数读取每一行时,我尝试将此行存储在一个临时变量中,以便将其插入到学生类的构造函数中,然后将该副本推送到队列。这似乎是不允许的,因为当我尝试存储信息时,它会显示“没有运算符 '=' 与这些操作数匹配”。

我遇到的另一个问题是读取沙拉的盎司值,这是一个整数值,我已经搜索过,但我没有找到任何方法可以直接读取数值并将其传递给整数变量。很抱歉解释冗长,但我想确保我清楚,任何帮助表示赞赏。

这是我尝试执行此操作的代码的一部分:

string temp_name;
string temp_group;
string temp_entree;
string temp_snack;
int temp_salad;


string line2;
queue<student> line;
ifstream myfile ("students.txt");
if(myfile.is_open())
    while(myfile.good())
    {
        temp_name= getline(myfile, line2);
        temp_group= getline(myfile, line2);
        temp_salad= getline(myfile, line2);
        temp_entree= getline(myfile, line2);
        temp_snack= getline(myfile, line2);

student s(temp_name, temp_group, temp_entree, temp_snack, temp_salad);
    //..... 
    }
4

3 回答 3

0

getline 不返回字符串,因此您不应该尝试将返回值分配给字符串。

做:

getline(myfile, temp_name);

代替

temp_name = getline(myfile, line2);

要读取文件中的下一个整数,请使用流输入运算符:

int temp_salad;
myfile >> temp_salad;
if (myfile.fail())
    std::cerr << "we failed to read temp_salad ounces\n";
于 2012-05-09T04:34:24.110 回答
0

getline()return istream&,这只是从中提取行后的第一个参数。它将该行读入第二个参数(line2在您的示例中)。所以,它应该看起来像这样:

getline(myfile, name);
getline(myfile, group);
// ...

此外,getline读入字符串,因此您需要将该字符串转换为整数,然后再将其存储在temp_salad. 有几种方法可以做到这一点,其中最简单的是

getline(myfile, temp);
salad = atoi(temp.c_str());

只要确保#include <cstdlib>在该文件中。

于 2012-05-09T04:39:32.183 回答
0

您可以使用operator>>从输入中读取整数并将其放入变量中,如:myfile >> my_int;.

由于您显然已将其定义student为一个班级,因此我会operator>>为该班级重载以读取学生的所有数据:

std::istream &operator>>(std::istream &is, student &s) { 
    std::getline(is, s.name);
    std::getline(is, s.group);
    std::getline(is, s.entree);
    std::getline(is, s.snack);
    std::string temp;
    std::getline(is, temp);
    s.salad = lexical_cast<int>(temp);    
    return is;
}

然后我们可以使用该运算符读入student对象 - 直接在循环中,就像你上面那样,或者间接地,例如通过istream_iterator对该类型的实例化,例如:

std::deque<student> line((std::istream_iterator<student>(infile)),
                          std::istream_iterator<student>());

请注意,在这种情况下,我使用的是双端队列而不是实际的队列——在 C++ 中,队列被定义为迭代器适配器,并且通常是一种二等公民。std::deque通常(包括这种情况)更简单,即使您不需要double-ended其定义的一部分。

于 2012-05-09T04:43:39.847 回答