2016-02-02 164 views
1

我正在嘗試將.txt文件寫入用戶的HOME目錄。將文件寫入用戶的主目錄C

我曾嘗試:

char str[] = "TEST"; 
char* file = strcat(getenv("HOME"), "/dataNumbers.txt"); //I am concatenating the user's home directory and the filename to be created. 
myFile = fopen(file,"w"); 
fwrite(str , 1 , sizeof(str) , myFile); 

然而,這並不能創建文件。

+0

1.文件變量的值是多少?它是預期的文件名嗎? 2.運行此代碼的用戶是否有權寫入'$ HOME'?你會認爲這應該是安全的,但你應該再次檢查該目錄的權限。 –

+0

如果它不創建文件,你也不應該調用'fwrite()'。這裏明顯缺少錯誤檢查。你需要測試'myFile'爲null,如果找到,則調用'perror()'或它的朋友,而不是繼續進行。 – EJP

回答

3

您錯誤地使用了strcat

char *file; 
char *fileName = "/dataNumbers.txt"; 

file = malloc(strlen(getenv("HOME") + strlen(fileName) + 1); // to account for NULL terminator 
strcpy(file, getenv("HOME")); 
strcat(file, fileName); 

file現在將包含連接的路徑和文件名。

顯然,這可以寫得更乾淨。我只是想要很直接。

+0

您的代碼中缺少一對關閉對象,但爲簡單明瞭的答案提供+1。 –

3

您不能將strcat()設置爲環境變量。你需要另一個緩衝區:

char file[256]; // or whatever, I think there is a #define for this, something like PATH_MAX 
strcat(strcpy(file, getenv("HOME")), "/dataNumbers.txt"); 
myFile = fopen(file,"w"); 

編輯爲了解決下面的意見,你應該首先確保數據要連接不溢出file緩衝區,或者動態地分配它 - 不忘免費它之後。

+0

修復後,它可能會因爲權限而失敗。確保您有權在用戶的主目錄中創建文件。 –

+0

@LeeDanielCrocker推測「$ HOME」是當前運行顯示代碼的用戶的主目錄。最有可能的是不應該有許可問題......但是重複檢查可能是一個好主意。 –

+0

如果組合超過255個字符,將會很危險。 –

0

像C中的字符串是而不是像其他高級語言中的字符串一樣;也就是說,您必須自己爲它們分配所有空間。使用c-string函數時,需要確保爲結果字符串分配足夠的內存,方法是在堆棧上保留足夠的空間(即char filename [HOPEFULLY_ENOUGH])或通過堆(malloc()和friends)。你不能指望getenv返回一個有足夠空間的字符串連接到;

這裏有一個完整的程序,從開始到結束,做你想做的事(減去一些迂腐錯誤檢查):

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *filename = "/dataNumbers.txt"; 
    char *writeString = "TEST"; 
    char *home_dir = getenv("HOME"); 
    char *filepath = malloc(strlen(home_dir) + strlen(filename) + 1); 
    strncpy(filepath, home_dir, strlen(home_dir) + 1); 
    strncat(filepath, filename, strlen(filename) + 1); 
    printf("%s\n", filepath); 

    FILE *myFile = fopen(filepath, "w"); 
    fwrite(writeString, 1, strlen(writeString), myFile); 
    fclose(myFile); 
    free(filepath); 
    return 0; 
} 

strncpy()函數將複製字符串加上空終止符(這是爲+1的原因)。 strncat將開始在空終止符處連接,並且生成的連接字符串本身必須以空終止(因此,在strncat的第三個參數中爲+1)。

我使用malloc和free,因爲很難準確知道文件的完整路徑的長度。你可以用一些巨大的東西(比如char [4096]),但這看起來很浪費,不是嗎? malloc()允許你精確地保留你需要的內存量。沒有更多,也沒有更少。

您也可以使用snprintf函數進行字符串連接。包括我這個只爲您的個人致富,有時它的好,有多種方式做同樣的事情,即使的strcpy和strcat的會令你的意圖更清楚你的代碼的讀者:

希望這幫助!