gpt4 book ai didi

c++ - 多次从 ifstream 读取

转载 作者:太空宇宙 更新时间:2023-11-04 11:44:20 25 4
gpt4 key购买 nike

如果这是一个非常简单的问题,我深表歉意,但我是 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

最佳答案

问题是在您读取导出后,设置了流 failbit。只要它已设置,它就不会读取任何内容。

您必须调用 std::istream::clear清除错误。


顺便说一下,还有一种更像 C++ 的方式来读入 vector :

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

引用资料:

在执行此操作之前,您当然必须先阅读“标签”(垃圾)。

关于c++ - 多次从 ifstream 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20237164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com