2015-03-12 3 views
1

Я слежу за учебником по платформе allegro 5, и его файловый менеджер использует! OpenFile.eof(), и я слышал, что он не очень хорош, и я уверен, что он дает мне векторный индекс, выходящий за пределы диапазона. Есть ли что-нибудь, что я могу использовать помимо него? Также вы можете проверить мой класс класса incas, который дает мне векторный индекс вне диапазона ошибки? Я не могу понять это, и я уверен, что это от файлового менеджера, но я не могу сказать.Что я могу сделать, чтобы не использовать! OpenFile.eof()?

Он выводит только первую строку карты. Когда я изменить его в то время как (станд :: GetLine (OpenFile, линия)) Я даже не добраться до StD :: соиЬ < < содержание [я] [K] < < "к:" < < < < к "содержание" < < содержание [i] .size() < < std :: endl < < std :: endl;

Когда я его изменяю до (std :: getline (openFile, line)), атрибуты и содержимое получаются только по 8.

еще нужна помощь = \

FileManager.CPP

#include "FileManager.h" 


FileManager::FileManager() 
{ 
    identifierFound = false; 
} 


FileManager::~FileManager() 
{ 
} 

void FileManager::LoadContent(const char *filename, std::vector<std::vector<std::string>> &attributes, std::vector<std::vector<std::string>> &contents) 
{ 
    std::ifstream openFile(filename); 
    std::string line, newLine; 

    if(openFile.is_open()) 
    { 
     while(std::getline(openFile, line)) 
     { 
      std::stringstream str; 

      if(line.find("Load=") != std::string::npos) 
      { 
       type = LoadType::Attributes; 
       line = line.erase(0, line.find("=") + 1); 
       tempAttributes.clear(); 
      } 
      else 
      { 
       type = LoadType::Contents; 
       tempContents.clear(); 
      } 

      str << line; 

      while(std::getline(str, newLine, ']')) 
      { 
       newLine.erase(std::remove(newLine.begin(), newLine.end(), '['), newLine.end()); 

       std::string erase = " \t\n\r"; 

       newLine.erase(newLine.find_last_not_of(erase) + 1); 

       if(type == LoadType::Attributes) 
        tempAttributes.push_back(newLine); 
       else 
        tempContents.push_back(newLine); 

       std::cout << newLine << std::endl; 
      } 

      if(type == LoadType::Contents && tempContents.size() > 0) 
      { 
       attributes.push_back(tempAttributes); 
       contents.push_back(tempContents); 
      } 
     } 
    } 
    else 
    { 

    } 
} 

void FileManager::LoadContent(const char *filename, std::vector<std::vector<std::string>> &attributes, std::vector<std::vector<std::string>> &contents, std::string identifier) 
{ 
    std::ifstream openFile(filename); 
    std::string line, newLine; 

    if(openFile.is_open()) 
    { 
     while(!openFile.eof()) 
     { 
      std::stringstream str; 
      std::getline(openFile, line); 

      if(line.find("EndLoad=") != std::string::npos && line.find(identifier) != std::string::npos) 
      { 
       identifierFound = false; 
       break; 
      } 
      else if(line.find("Load=") != std::string::npos && line.find(identifier) != std::string::npos) 
      { 
       identifierFound = true; 
       continue; 
      } 

      if(identifierFound) 
      { 

       if(line.find("Load=") != std::string::npos) 
       { 
        type = LoadType::Attributes; 
        line = line.erase(0, line.find("=") + 1); 
        tempAttributes.clear(); 
       } 
       else 
       { 
        type = LoadType::Contents; 
        tempContents.clear(); 
       } 

       str << line; 

       while(std::getline(str, newLine, ']')) 
       { 
        newLine.erase(std::remove(newLine.begin(), newLine.end(), '['), newLine.end()); 

        std::string erase = " \t\n\r"; 

        newLine.erase(newLine.find_last_not_of(erase) + 1); 

        if(type == LoadType::Attributes) 
         tempAttributes.push_back(newLine); 
        else 
         tempContents.push_back(newLine); 

        std::cout << newLine << std::endl; 
       } 

       if(type == LoadType::Contents && tempContents.size() > 0) 
       { 
        attributes.push_back(tempAttributes); 
        contents.push_back(tempContents); 
       } 
      } 
     } 
    } 
    else 
    { 

    } 
} 

Layer.CPP

#include "Layer.h" 


Layer::Layer(void) 
{ 
} 


Layer::~Layer(void) 
{ 
} 

std::pair<int, int> Layer::SetTiles(std::string tileString) 
{ 
    std::pair<int, int> tile; 
    tile.first = atoi(tileString.substr(0, tileString.find(',')).c_str()); 
    tile.second = atoi(tileString.substr(tileString.find(',') + 1).c_str()); 
    return tile; 
} 

void Layer::LoadContent(std::string layerID, std::string mapID) 
{ 
    std::string fileName = "Maps/"+mapID+".txt"; 
    fileManager.LoadContent(fileName.c_str(), attributes, contents, layerID); 
    int indexY = 0; 

    for(int i = 0; i < attributes.size(); i++) 
    { 
     for(int j = 0; j < contents[i].size(); j++) 
     { 
      if(attributes[i][j] == "SolidTiles") 
      { 
       solidTiles.push_back(SetTiles(contents[i][j])); 
       std::cout << contents[i][j] << std::endl << std::endl; 
      } 
      else if(attributes[i][j] == "TileSheet") 
      { 
       std::cout << contents[i][j] << std::endl << std::endl; 
       tileSheet = al_load_bitmap(contents[i][j].c_str()); 
      } 
      else if(attributes[i][j] == "StartLayer") 
      { 
       for(int k = 0; k < contents[i].size(); k++) 
       { 
        std::cout << contents[i][k] << " k: " << k << " contents: " << contents[i].size() << std::endl << std::endl; 
        if(contents[i][k] != "---") 
        { 
         std::cout << contents[i][k] << std::endl << std::endl; 
         ALLEGRO_BITMAP *tileImage; 
         Tile::State tempState = Tile::State::Passive; 
         std::pair<int, int> tile = SetTiles(contents[i][k]); 

         if(std::find(solidTiles.begin(), solidTiles.end(), tile) != solidTiles.end()) 
         { 
          tempState = Tile::State::Solid; 
         } 

         tileImage = al_create_sub_bitmap(tileSheet, tile.first * 32, tile.second * 32, 32, 32); 

         std::pair<float, float> position(k * 32, indexY * 32); 

         Tile tileInstance; 
         tiles.push_back(tileInstance); 
         tiles[tiles.size()-1].SetContent(tileImage, tempState, position); 
         std::cout << tiles.size() << std::endl; 
        } 
       } 
       indexY++; 
      } 
     } 
    } 
} 

void Layer::UnloadContent() 
{ 
    for(int i = 0; i < tiles.size(); i++) 
     tiles[i].UnloadContent(); 

    al_destroy_bitmap(tileSheet); 
} 

void Layer::Update() 
{ 
} 

void Layer::Draw(ALLEGRO_DISPLAY *display) 
{ 
    for(int i = 0; i < tiles.size(); i++) 
     tiles[i].Draw(display); 
} 

map1.txt

Load=[MapProperties] 

Load=[TileDimensions] 
[32,32] 

EndLoad=[MapProperties] 

Load=[Layer1] 

Load=[SolidTiles] 
[2,0] 
[1,0] 

Load=[NullTile] 
[---] 

Load=[Motion] 
[2,0:Static] 

Load=[TileSheet] 
[TileSheets/tilesheet1.png] 

Load=[StartLayer] 

[2,0][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][2,0][2,0][2,0][---][---][---][---][---] 
[---][---][---][---][---][---][---][2,0][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][2,0][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][2,0][2,0][2,0][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---] 
[1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0] 

Load=[EndLayer] 
[dummy] 

EndLoad=[Layer1] 

Load=[PlayerPosition] 
[0,0] 
+0

Anymore help? что ответ не помог – user4648142

ответ

1

Во-первых, реальная проблема ISN» t с использованием file.eof(); есть случаи, когда это то, что вы хотите (хотя я не могу придумать, где бы это было в a — случаи, когда это уместно, после того, как у вас есть , уже обнаружено, что вход не сработал). Реальная проблема заключается в том, что код использует значение, считанное с std::getline, не проверив, что ему удалось выполнить . Так как это присутствует только один раз в вашем коде, просто используйте такое же решение, как и в других циклах: while (std::getline(...)).

+0

Я только что добавил новую информацию. Я просто пробовал это, но теперь он даже не прошел (int k = 0; k user4648142

Смежные вопросы