2013-06-20 6 views
0

Я сейчас Maing игры RTS и я загружаю единицу из текстовых файлов Int так:Ошибки при загрузке из текстового файла

/блочный// плеер// х со-ог// у со-ог// здоровье/

Я использую вектор отстойника (только единица я в настоящее время) ОБЪЕКТЫ (не указатели), чтобы сохранить все блоки

Когда я загружаю единицы, и я попробуйте нарисовать их на экране, их просто нет. Я сделал несколько тестов, и это встречается, что вектор «Поселенцы» является пустым, даже после того, как я загружаю из текстового файла

Код 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()) {". Но это только предположение

ответ

1

Есть несколько проблем с кодом:

  • Ваш цикл в то время как петли, пока ВФ установлен (вы должны только цикл до ВФ установлен)
  • Даже если вы исправляете цикл 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; 
} 

Тогда вы можете прочитать весь файл отстойников с помощью простого в то время как цикл:

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

+0

, так что у меня уже есть класс Settler, но я добавлю структуру поселенца в main.cpp, правильно? – user2466076

+0

Нет, я просто определил Settler здесь, потому что вы не дали определение своего класса, и я хотел сделать этот пример полным примером. Конечно, вы можете использовать свой собственный сеттер, но тогда вам, возможно, придется сменить оператор >> перегрузка. – bennofs

+0

Огромное спасибо, Я проверяю его и отвечаю в секундах – user2466076