gpt4 book ai didi

c++ - 我该怎么做才能不使用 !openFile.eof()?

转载 作者:行者123 更新时间:2023-11-30 05:46:13 25 4
gpt4 key购买 nike

我一直在关注有关 allegro 5 平台游戏的教程,他的文件管理器使用 !openFile.eof(),我听说它不太好,我很确定它是什么给我一个 vector 下标超出范围错误。除了它还有什么我可以使用的吗?您还可以检查我的图层类,以防出现 vector 下标超出范围错误吗?我无法弄清楚,我很确定它来自 filemanager,但我不能说。

它只输出 map 的第一行。当我将其更改为 while(std::getline(openFile, line)) 时,我什至从未到达 std::cout << contents[i][k] << "k: "<< k << "contents: "<< 内容[i].size() << std::endl << std::endl;

当我将其更改为 while(std::getline(openFile, line)) 时,属性和内容各只有 8 个。

仍然需要帮助=\

文件管理器.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
{

}
}

图层.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);
}

map 1.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]

最佳答案

首先,真正的问题不在于使用file.eof();有些情况下这就是你想要的(虽然我想不出它会在哪里a while——适合的情况都是在你有之后已经检测到输入失败)。真正的问题是代码使用通过 std::getline 读取的值而不验证它成功了。由于这只在您的代码中出现一次,因此只需使用与其他循环中相同的解决方案:while ( std::getline( ... ) )

关于c++ - 我该怎么做才能不使用 !openFile.eof()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29015147/

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