C ++将文件读入char *数组

时间:2012-12-09 01:56:28

标签: c++

我在将.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]; ,没有显示任何内容。

我做错了什么?

提前谢谢!

3 个答案:

答案 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;
}