2012-10-09 114 views
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然而,当我运行日。 E码,文件确实产生,但其名称中包含不可打印的字符(代码为两个命令如下之间运行):

enter image description here

请有什么建议可能是错的。

+0

显示哪些设置'path'的代码。顺便说一句,这是C,而不是C++ – UmNyobe

+0

你如何设置代码中的'路径'变量?它是一个硬编码的路径,你提示用户还是将它作为参数传递? – Ryan

+0

@UmNyobe是对的。你的问题是在设定的路径上。你在这个变量中有一些垃圾。 –

回答

2

man getcwd

作为一个扩展POSIX.1-2001标准,Linux操作系统(libc4,libc5的,glibc的)GETCWD()分配动态使用malloc(3)如果是BUF NULL缓冲区。在这种情况下,分配的缓冲区具有长度大小,除非大小为零,而当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); 
} 
+2

无论如何,fopen()不会默认查看当前的工作目录吗?当你可以将'fileName'传递给'fopen()'时,这看起来像很多工作。 – Ryan

+0

@Ryan,好点,是的。然而,这是非打印的原因,但只是使用'fopen(fileName)'要简单得多。 – hmjd

1

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