2012-10-09 110 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結束。