1

我在将 .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 << levels[0]; 紧接着

levels[0] = strtok(buf, " ");

然后我得到一个很好的输出。但是,当我尝试cout << levels[0]; 从其他地方,什么都没有显示。

我究竟做错了什么?

先感谢您!

4

3 回答 3

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数组中每个指向通过分配的内存的成员所指向的内存new []。你通过调用来做到这一点delete []

于 2012-12-09T02:00:15.363 回答
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," ");

这是在堆栈内存中创建一个对象(没有使用 new 运算符)并返回一个指向该内存的指针,一个您分配给级别 [0] 的指针。

离开这个函数后,它使用的内存会从堆栈中取出,销毁它创建的任何内存,这将是 strtok 返回的指针指向的内存。

这就是指针不再有效的原因。

不过,其他人得到了复制数据的正确方法,strcopy()。

// 对于每个字符串,将其长度分配为堆级别上的 char 缓冲区[0] = new char[64]; // 获取指向数据的指针 char* temp = strtok(buf, " ");

// 检查从 strtok() 返回的 NULL 指针 if (temp) tstrncpy(levels[0], temp, 64); // 将数据从 temp 复制到 heap

于 2012-12-09T03:24:31.203 回答
0

这是我最终做的事情:

int Environment::parseLevels(char* filename) {
    ifstream myfile("levels.txt", ifstream::in);
    int i = 0;
    while(myfile >> levels[i]) {
        i++;
    }
    return 0;
}
于 2012-12-09T04:05:23.693 回答