从ifstream多次读取

时间:2013-11-27 08:21:43

标签: c++ load ifstream

道歉,如果这是一个非常简单的问题,但我对C ++很新,而且我正在处理我正在进行的项目。

此项目的一部分涉及将对象的信息写入.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文件中的第一个房间被反复加载,但事实并非如此。

我非常感谢任何人可以提供的任何帮助,提前谢谢。

编辑: 现在我正在使用以下代码加载房间:

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 

1 个答案:

答案 0 :(得分:1)

问题是,在您阅读了退出后,会设置流failbit。只要它设置它就不会读任何东西。

您必须致电std::istream::clear以清除错误。


顺便说一下,有一种更多的C ++ - ish方式来读入一个向量:

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

参考文献:

在执行此操作之前,您当然必须首先阅读“标记”(garbage)。