无法创建新文件

时间:2012-10-09 15:24:18

标签: c file-io

我的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。但是,当我运行代码时,确实创建了文件,但是它的名称包含不可打印的字符(代码在以下两个命令之间运行):

enter image description here

请说明可能出现的问题。

2 个答案:

答案 0 :(得分:2)

来自man getcwd

  

作为POSIX.1-2001标准的扩展,如果buf为NULL,则Linux(libc4,libc5,glibc)getcwd()使用malloc(3)动态分配缓冲区。在这种情况下,分配的缓冲区具有长度大小,除非size为零,当buf根据需要分配时。调用者应释放(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);
}

答案 1 :(得分:1)

您的path变量可能不会以\0结尾。