道歉,如果这是一个非常简单的问题,但我对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
答案 0 :(得分:1)
问题是,在您阅读了退出后,会设置流failbit
。只要它设置它就不会读任何东西。
您必须致电std::istream::clear
以清除错误。
顺便说一下,有一种更多的C ++ - ish方式来读入一个向量:
std::copy(std::istream_iterator<int>(inFile),
std::istream_iterator<int>(),
std::back_inserter(vec));
参考文献:
在执行此操作之前,您当然必须首先阅读“标记”(garbage
)。