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 << レベル[0];を行う場合。直後の

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

その後、良い出力が得られます。ただし、<< level[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の各メンバーによって指されているメモリを解放するためのループがあることを確認してください。これを行うには、次のように呼び出します。levelsnew []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," ");

これは、スタックメモリにオブジェクトを作成し(新しい演算子は使用されていません)、そのメモリへのポインタ(levels [0]に割り当てているポインタ)を返します。

この関数を終了すると、使用されているメモリがスタックから削除され、作成されたメモリがすべて破棄されます。これは、strtokから返されたポインタが指しているメモリになります。

これが、ポインタが無効になった理由です。

他の誰かがデータをコピーする適切な方法、strcopy()を手に入れました。

//すべての文字列に対して、その長さをヒープレベルのcharバッファとして割り当てます[0] = new char [64]; //データへのポインタを取得しますchar*temp = strtok(buf、 "");

// strtok()からのNULLポインタの戻りをチェックif(temp)tstrncpy(levels [0]、temp、64); //データを一時からヒープにコピーします

于 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 に答える