字符串和fstream的问题

时间:2012-05-09 04:26:34

标签: c++ simulation fstream

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

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

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

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

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);
    //..... 
    }

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:0)

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

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

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

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

请确保该文件中的#include <cstdlib>

答案 2 :(得分: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>());

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