gpt4 book ai didi

c++ - 使用指针c++的问题

转载 作者:行者123 更新时间:2023-11-28 03:03:07 26 4
gpt4 key购买 nike

#include <iostream>
#include <fstream>
#include <cstring>
#include <map>
using namespace std;

int main()
{
cout << "Hello world!" << endl;

//define a bool to determine if you're still in the file's header section or not
bool header = true;
//define the map as a multidimensional string array that stores up to 100 z-levels
//and 50x50 tiles per z level
char* worldmap[100][50][50];
int zLevel=0;
//header declaration map
map<string, char*> declarations;
//create an input file stream object
ifstream file;
//open file
file.open("map1.dmm");
//validate file
if(!file.good()){return 1;}

//begin reading the file
while(!file.eof()){
//create a character array to write to
char line[512];
//read the file line by line; write each line to the character array defined above
file.getline(line, 512);

//header check
if(header){
if(!line[0]){
header = false;
break;
}else{
bool declaringKey=true;
char* key={};
char* element={};
char* token[20]={};
token[0] = strtok(line, "\"()");
for(unsigned int n = 0;n<20;n++){

if(n>0)token[n] = strtok(NULL, "\"()");
//cout << token[0] << endl;
if(!token[n] || (token[n])[1] == '=')continue;
if(declaringKey){

key = token[n];
declaringKey=false;

}else{
//cout << "pow" <<endl;
element = token[n];
cout<<"declarations[" << key << "] = " << element << endl;
declarations.emplace(key,element); //<-------------- problem line, i think
cout << declarations[key] << endl;

}

}declaringKey=true;

}
}else{
if(!line[0]) {
zLevel++;
continue;
}

}

}
//string test = "aa";

return 0;

}

我正在尝试创建一个 map 加载器,用于从文本文件加载简单 map 。我知道还有其他可用的 map 加载器,但其中大多数的功能远远超出我的需要。到目前为止,这段代码只读取了头部,它基本上定义了每组字符代表什么作为一个瓦片,例如:“aa”=“沙瓦”

问题是,当我将键/元素放置到声明映射中时,它似乎对所有键使用相同的元素。我假设这是因为通过定义一个字符指针,它总是指向相同的数据,并且仅用于更改该指针包含的值的目的,而不是分配新数据并将它们分开。

但这又提出了另一个问题,为什么它会为相同的元素放置不同的键,即使两者都是指针......?总之,

我怎样才能使所有的键/元素都是独立的字符数组,而不是指向由数组分割出的完全相同的空间的指针..?

编辑:除了将相同元素存储到所有键之外,您可以假设代码有效。此外,它存储的元素始终是从文件的 header 部分解析出来的最后一个元素。

最佳答案

也只需使用 std::string 作为值。这应该可以解决您眼前的问题。

就是说,不要不要使用stream.eof() 来控制循环读取值!这是行不通的。相反,总是尝试从流中读取,然后验证读取是否成功,例如:

while (file.getline(line, sizeof(line))) {
// ...
}

就个人而言,我不会读入固定大小的缓冲区并使用 std::string 代替:

for (std::string line; std::getline(file, line); ) {
// ...
}

从这一点来看,我也不会使用 strtok(),而是使用 std::string 的成员或合适的算法。这样我也不会误入歧途,考虑到存储指针是个好主意(更不用说我无法处理指针,因此我的程序不使用它们)。

关于c++ - 使用指针c++的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20293391/

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