0

C ++コードに、新しいファイルを作成するための簡単な行があります。

string fileName = "test";

// Create a file named "test"
rc = pf->CreateFile(fileName.c_str());

内部CreateFile関数(const char *fileName引数として、次のコードスニペットがあります。

// Create the file in current working directory
char *path = NULL;
path = getcwd(path, 0);
path = strcat(path, "/");
path = strcat(path, fileName);
FILE *fHandle = fopen(path, "wb");

文字列pathには、作成するファイルの完全な絶対パスが含まれています。ファイル名はtestです。ただし、コードを実行すると、ファイルは実際に作成されますが、その名前には印刷できない文字が含まれています(コードは次の2つのコマンドの間に実行されました)。

ここに画像の説明を入力してください

何が間違っている可能性があるかを提案してください。

4

2 に答える 2

2

男getcwdから:

POSIX.1-2001標準の拡張として、Linux(libc4、libc5、glibc)getcwd()は、bufがNULLの場合、malloc(3)を使用してバッファーを動的に割り当てます。この場合、bufが必要なだけ大きく割り当てられると、サイズがゼロでない限り、割り当てられたバッファーの長さはsizeになります。呼び出し元は、返されたバッファーを解放する必要があります(3)。

これは、追加するスペースが残っていないことを意味pathし、ポイントする配列の境界を上書きしてpath、未定義の動作を引き起こし、印刷できない文字の原因である可能性があります。

パスを保持できるバッファを構築するには、フルサイズを決定し、malloc()それを構築する必要があります。

char *path;
path = getcwd(path, 0);
if (path)
{
    /* The '+2' is for null terminator and the '/'. */
    const size_t size = strlen(path) + strlen(fileName) + 2;
    char* fullPath = malloc(size);
    if (fullPath)
    {
        sprintf(fullPath, "%s/%s", path, fileName);
        /* fopen() ... */
        free(fullPath);
    }
    free(path);
}
于 2012-10-09T15:34:16.973 に答える
1

path変数はおそらくで終わらないでしょう\0

于 2012-10-09T15:28:39.457 に答える