从文本文件加载时的bug
Bugs while loading from text file
我目前正在制作一款RTS游戏,我以这种方式从txt文件中加载单位:
1 1 700 200 10
/单位类型//玩家//x单位//y单位//血量/
我使用settler(我目前拥有的唯一单位)对象(不是指针)的向量来保存所有单位
当我加载单元并尝试在屏幕上绘制它们时,它们却不在那里。我做了一些测试,它发生的矢量"定居者"是空的,即使我从txt文件
加载main.cpp:
vector<Settler> settlers;
...
void load_units(string filename)
{
settlers.clear();
ifstream unit_file(filename.c_str());
string line;
vector<vector<int> > ww;
while(unit_file.eof())
{
while(getline(unit_file, line))
{
stringstream ss(line);
int i;
vector<int> w;
while( ss >> i )
{
w.push_back(i);
}
ww.push_back(w);
}
}
for(int i = 0; i < ww.size(); i++)
{
int type = ww[i][0];
int player = ww[i][1];
int x = ww[i][2];
int y = ww[i][3];
int hp = ww[i][4];
if(type == 1)//settler
{
Settler settler(x, y, hp, player);
settlers.push_back(settler);
}
}
unit_file.close();}
...
void init() {
SDL_Init( SDL_INIT_EVERYTHING );
TTF_Init();
Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 4096 );
SDL_WM_SetIcon(IMG_Load("icon.png"), NULL);
screen = SDL_SetVideoMode(1600, 900, 32, SDL_FULLSCREEN);
map = IMG_Load("tlo.png");
bar = IMG_Load("bar.png");
pause_menu = IMG_Load("menu.png");
save_game_menu = IMG_Load("save_game_menu.png");
save_prompt = IMG_Load("saved_prompt.png");
load_game_menu = IMG_Load("load_game_menu.png");
load_prompt = IMG_Load("loaded_prompt.png");
intro_control = true;
menu = true;
running = false;
paused = false;
saving = false;
loading = false;
mapX = 0;
mapY = 0;
Xoffset = 0;
Yoffset = 0;
load_map("mapa1.txt");
load_units("units1.txt");
for(int i = 0; i < 60; i++)
{
string file_frame;
stringstream ss;
ss << i + 1;
if(i < 9)
{
file_frame = ("intro/000");
}else
{
file_frame = ("intro/00");
}
file_frame.append(ss.str());
file_frame.append(".png");
intro[i] = IMG_Load(file_frame.c_str());
}}
…
int main( int argc, char* args[] ) {
int frame = 0;
Timer fps;
init();
Player p1(0, player_1_colour, "player 1");
int frame_control = 0;
while(intro_control)
{
…
PS:我怀疑"while(unit_file.eof()){"语句可能有问题。但这只是个猜测
你的代码有几个问题:
- 只要eof被设置,while循环就会循环(你应该只循环直到eof被设置)
- 即使你修复了while循环,它仍然是错误的,因为eof只在你读取它之后设置,所以你会有一个无效的条目
- 为什么首先得到一行,只是把它放在一个字符串流再次,然后解析它?您可以直接使用文件对象的流操作符。
我认为下面的方法可以更简洁地解决你的问题:
首先,定居者结构:
struct Settler {
int type; // Maybe some of those should be unsigned,
// but I just left them as you already had them
int player;
int x;
int y;
int health;
};
然后你可以重载类的>>操作符,允许它从任何输入流中流化。它将要读取的流作为第一个参数,将应该读取结果的对象作为第二个参数:
std::istream& operator>>(std::istream in&, Settler& settler) {
// Just read the values in the corresponding fields of Settler
return in >> settler.type
>> settler.player
>> settler.x
>> settler.y
>> settler.health;
}
然后你可以使用一个简单的while循环读取整个定居者文件:
int main() {
std::ifstream file("test.txt");
Settler current;
std::vector<Settler> settlers;
while(file >> current) { // Read as long as it's possible to
// read a Settler
settlers.push_back(current);
};
}
有一个工作示例(也重载<<虽然在实际程序中on可以重载<<在ideone
相关文章:
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- 是否有原子加载非原子值的函数?
- 将 bmp 文件加载到 TSpeedButton 中
- Bug与横幅>加载广告();功能
- 从文本文件加载时的bug