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