我在将.txt文件读入char *数组时遇到了麻烦。
我有一个看起来像这样的levels.txt文件:
level1.txt
level2.txt
我在类中定义了我的数组
char* levels[10];
我的解析功能如下:
// Parse the level list file
int Environment::parseLevels() {
ifstream data;
data.open("levels.txt");
char buf[64];
for (int i=0; i<sizeof(levels); i++) {
data.getline(buf, 64);
levels[0] = strtok(buf, " ");
}
}
如果我 cout&lt;&lt;
之后的等级[0];levels[0] = strtok(buf, " ");
然后我得到了很好的输出。但是,当我尝试 cout&lt;&lt;来自其他地方的等级[0]; ,没有显示任何内容。
我做错了什么?
提前谢谢!
答案 0 :(得分:2)
由strtok
返回的指针永远不会指向有效的内存,因为您正在进行令牌化的缓冲区是在堆栈上声明的。如果要在函数体外部使用字符串,则需要实际复制strtok
的返回指针所指向的字符串,而不是指针本身。
所以基本上将代码修改为以下内容:
levels[0] = new char[64];
char* temp = strtok(buf, " ");
//check for NULL pointer return from strtok()
if (temp)
{
//if the pointer is not NULL, copy the contents of the temporary string
//returned by strtok into more permanent memory allocated on the heap
//and being pointed to by levels[0]
//Use strncpy() to prevent the risk of a buffer overflow
strncpy(levels[0], temp, 64);
}
然后在你的Environment
对象的析构函数中,确保有一些循环释放levels
数组的每个成员指向的内存,这些成员指向通过{分配的内存{1}}。您可以致电new []
答案 1 :(得分:1)
这是你的功能:
// Parse the level list file
int Environment::parseLevels() {
ifstream data;
data.open("levels.txt");
char buf[64];
for (int i=0; i<sizeof(levels); i++) {
data.getline(buf, 64);
levels[0] = strtok(buf, " ");
}
}
您正在分配levels[0] = strtok(buf," ");
这是在堆栈内存中创建一个对象(没有使用新的运算符)并返回一个指向该内存的指针,一个指向level [0]的指针。
离开此函数后,它使用的内存将从堆栈中取出,销毁它创建的任何内存,这将是指针从strtok返回的指针所指向的内存。
这就是指针不再有效的原因。
其他人通过strcopy()获得了复制数据的正确方法。
//对于每个字符串,将其长度分配为堆上的char缓冲区 levels [0] = new char [64]; //获取指向数据的指针 char * temp = strtok(buf,“”);
//检查从strtok返回的NULL指针() if(temp)tstrncpy(levels [0],temp,64); //将数据从temp复制到堆
答案 2 :(得分:0)
这是我最终做的事情:
int Environment::parseLevels(char* filename) {
ifstream myfile("levels.txt", ifstream::in);
int i = 0;
while(myfile >> levels[i]) {
i++;
}
return 0;
}