2012-05-09 3 views
1

В настоящее время я работаю над проектом, где мне нужно реализовать несколько классов, чтобы имитировать столовую. Каждый «студент», который ждет очереди, чтобы получить еду, имеет 5 переменных, которые описывают их, то есть: имя, группа, тип входа, тип закуски/десерта и число, представляющее количество салата, который они планируют покупать в унциях , Идея состоит в том, что вся эта информация будет считываться с использованием fstream из текстового файла (с контуром, соответствующим определенному порядку и повторяющемуся для каждого ученика). Когда каждый ученик читается, я подталкиваю ученика к очереди, чтобы имитировать их, ожидая очереди.Проблемы со строками и 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); 
    //..... 
    } 
+0

Спасибо за помощь – Mike

ответ

0

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

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

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

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

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

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"; 
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.

Смежные вопросы