Проблемы со строками и fstream

В настоящее время я работаю над проектом, в котором мне нужно реализовать несколько классов для имитации столовой. У каждого «студента», ожидающего в очереди, чтобы получить свою еду, есть 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);
    //..... 
    }

person Mike    schedule 09.05.2012    source источник


Ответы (3)


getline() возвращает istream&, который является первым аргументом после извлечения из него строки. Он считывает строку во второй аргумент (line2 в вашем примере). Итак, это должно выглядеть примерно так:

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

Кроме того, getline читается в строки, поэтому вам нужно преобразовать эту строку в целое число, прежде чем сохранять ее в temp_salad. Есть несколько способов сделать это, самый простой из которых

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

Просто убедитесь, что в этом файле есть #include <cstdlib>.

person Eric W.    schedule 09.05.2012

getline не возвращает строку, поэтому вам не следует пытаться присвоить возвращаемое значение строке.

do:

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";
person bames53    schedule 09.05.2012

Вы можете использовать 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 его определения.

person Jerry Coffin    schedule 09.05.2012