【问题标题】:Bugs while loading from text file从文本文件加载时的错误
【发布时间】:2013-06-20 18:36:36
【问题描述】:

我目前正在玩 RTS 游戏,我正在以这种方式从 txt 文件中加载单位:

1 1 700 200 10

/unit type/ /player/ /x co-ord/ /y co-ord/ /health/

我正在使用一个定居者向量(我目前只有一个单位)对象(不是指针)来保留所有单位

当我加载单元并尝试在屏幕上绘制它们时,它们根本不存在。我做了一些测试,发现即使从 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()){”语句可能有问题。但这只是猜测

【问题讨论】:

    标签: c++ text vector load sdl


    【解决方案1】:

    您的代码有几个问题:

    • 只要设置了 eof,您的 while 循环就会循环(您应该只循环直到设置了 eof)
    • 即使你修复了 while 循环,它仍然是错误的,因为 eof 只是在你阅读之后才设置,所以你会有一个无效的条目
    • 为什么先得到一行,然后再放到一个字符串流中再解析呢?您可以直接使用文件对象的流操作符。

    我认为以下方法可以更清洁地解决您的问题:

    一、Settler结构:

    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);
      };
    }
    

    ideone

    有一个工作示例(它也重载 > 读入相同的格式)

    【讨论】:

    • 所以我已经有一个 Settler 类,但是我在 main.cpp 中添加了一个settler 结构,对吧?
    • 不,我只是在这里定义了 Settler,因为你没有给出你的类定义,我想让这个例子成为一个完整的例子。您当然可以使用自己的 Setter,但是您可能必须更改 operator>> 重载。
    • 非常感谢,我检查一下,过会儿回复
    • 等等,如果我尝试从同一个文件中加载不同的单位(比如 sodier obj.)呢????
    • 也许你应该读一本好书或教程(虽然好教程不容易找到)来学习 C++。 C++ 不是用于复制和粘贴程序的好语言,也不是用于边做边学的语言,有太多的陷阱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2016-02-04
    • 2013-09-05
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多