2013-11-27 2 views
0

Извините, если это очень простой вопрос, но я довольно новичок в C++, и у меня возникают проблемы с проектом, над которым я работаю.Чтение из ifstream несколько раз

Часть этого проекта включает в себя запись информации об объекте в файл .txt и возможность чтения этого файла .txt для загрузки в объект. (В этом случае информация записывается, а не сам объект, так что кто-то может легко редактировать .txt для изменения объекта).

Функции Я звоню, чтобы прочитать из файла .txt выглядит следующим образом:

void Room::load(ifstream& inFile) 
{ 
string garbage; 
string str; 
inFile >> garbage >> garbage >> mId; 
inFile >> garbage; getline(inFile, mName); 
inFile >> garbage; getline(inFile, mDesc); 
loadVec(garbage, inFile, mExits); 
} 

«мусор» используется, чтобы избавиться от дескрипторов в .txt, чтобы помочь пользователю.

Объект типична помещение должно выглядеть следующим образом:

Room ID: 2 
Name: Foyer 
Description: The player can enter here from the kitchen. 
Exits: 3 4 

Моя проблема возникает, когда я пытаюсь загрузить несколько номеров. Первая комната будет загружаться отлично, но любая последующая комната не будет правильно загружаться.

Я бы по крайней мере ожидал, что он потерпит неудачу таким образом, что первая комната в файле .txt будет загружена повторно, но это не так.

Я был бы очень благодарен за любую помощь, которую мог бы предложить любой человек, заранее.

Edit: Сейчас я загружаю номера, используя следующий код:

if (inFile) 
    { 
    //Assign data to objects 
    room0.load(inFile); 
    room1.load(inFile); 
    } 

В этом случае room0 ветров с данными первой комнаты в .txt файла, но room1 остается неизменным с исключение из-за того, что его выходы очищены по какой-либо причине.

Тестирование программы на данный момент дает следующее:

BEFORE LOAD 

ID= -1 
NAME= Nowhere 
DESC= There's nothing here. 
Exits= -1 

ID= -1 
NAME= Nowhere 
DESC= There's nothing here. 
Exits= -1 

AFTER LOAD 

ID= 1 
NAME= Kitchen 
DESC= This is the first room the player will see. 
Exits= 2 3 5 6 

ID= -1 
NAME= Nowhere 
DESC= There's nothing here. 
Exits= 

Press any key to continue . . . 

Эти номера является room0 и room1 соответственно до и после нагрузки.

Вот что функция loadVec выглядит следующим образом:

//Loads consecutive integers from inFile, saving them to vec 
void loadVec(string& garbage, ifstream& inFile, vector<int>& vec) 
{ 
int num; 
vec.clear(); 

inFile >> garbage >> num; 
vec.push_back(num); 

while (inFile) 
{ 
    inFile >> num; 
    vec.push_back(num); 
} 

vec.erase(vec.begin() + vec.size() - 1); 
} 

И неотредактированным .txt файл, из которого программа должна быть нагрузка:

Room ID: 1 
Name: Kitchen 
Description: This is the first room the player will see. 
Exits: 2 3 5 6 

Room ID: 2 
Name: Foyer 
Description: The player can enter here from the kitchen, they can exit to the rooms  with the IDs listed as 'Exits'. 
Exits: 3 4 

Room ID: 3 
Name: Bathroom 
Description: This is the third room. 
Exits: 4 
+0

Приведенный выше код не загружает выходы. Если это не проблема, я думаю, вам нужно показать больше кода. В частности, вам нужно показать * loop *, где вы пытаетесь загрузить более одной комнаты. – john

+0

- информация других комнат также хранится в функции загрузки? вы пытались закрыть файл после его записи и снова открыть его для чтения? –

+0

Возможно ли это с функцией 'loadVec'? Как вы называете эту функцию? Не могли бы вы показать какой-то контекст, как вы его используете? А вы пробовали переходить через код, по очереди, в отладчик? –

ответ

0

Проблема заключается в том, что после того, как вы прочтете выходы , установлены потоки failbit. Пока он установлен, он ничего не прочитает.

Чтобы устранить эту ошибку, необходимо позвонить по телефону: std::istream::clear.


Кстати, есть более C++ - иш способ чтения в вектор:

std::copy(std::istream_iterator<int>(inFile), 
      std::istream_iterator<int>(), 
      std::back_inserter(vec)); 

Ссылки:

Прежде чем это сделать, вы обязательно должны прочитать «тег» (garbage).

+0

Это прекрасно работает, спасибо вам большое! – pipding

+0

@rbissett Добро пожаловать. :) Кстати, вы можете посмотреть мое обновление, есть «лучшие» способы чтения значений в вектор. –

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