2012-06-30 70 views
1

我有一個正在嘗試讀取文件的c程序。使用access()命令它說文件在那裏,但fopen()返回NULL,errno說該文件不存在。access()表示文件存在,但fopen()表示不存在

代碼截斷片段:

FILE *fp; 
    char *filename = strdup(git_dir); 
    strcat(filename, "/HEAD"); 

    printf(git_dir); 
    printf(":"); 
    printf(filename); 
    printf(":"); 

    if (access(filename, F_OK)) { 
    printf("Y U NO OPEN:"); 
    } 

    fp = fopen(filename, "r"); 
    if (fp == NULL) { 
    printf(strerror(errno)); 
    return; 
    } 

正如你可能從代碼告訴,這是試圖打開一個Git倉庫的git的/封頭文件。這個失敗的特定存儲庫被克隆到另一個存儲庫的子目錄中,然後添加爲子模塊。我沒有通過運行git submodule update命令克隆的問題。

上面的代碼不會打印「Y U NO OPEN:」,但它確實打印出strerror()。我將文件名打印到屏幕上,並用less打開文件,並打開它。該程序生成的zsh我的提示,所以我想這是由我的身份運行,該文件的權限

-rw-r--r-- 1 ben users 23 Jun 30 13:32 HEAD 

有什麼建議?

+0

什麼printf(strerror(errno))打印? –

+0

@ AlexG.P .:你可以使用'perror(「ERROR」)'代替。 – Jack

+0

打印的錯誤是「文件不存在」的效果 – ben

回答

6

你不能做到這一點:

char *filename = strdup(git_dir); 
strcat(filename, "/HEAD"); 

要追加字符串「/ HEAD」,以文件名,文件名,但只有房間的git_dir內容。因此,你寫過緩衝區,覆蓋內存,並可能造成嚴重破壞,並且可能發生各種不可預知的行爲。

而是執行此操作:

char *filename = malloc(strlen(git_dir) + 6); //length of /HEAD + null terminator 
strcpy(filename, git_dir); 
strcat(filename, "/HEAD"); 

請記住,標準輸出通常是行緩衝也是如此。這意味着如果您的電子郵件地址爲printf("Y U NO OPEN:");,則可能無法立即看到輸出。打印一個換行符\ n,以刷新輸出。

+0

「perror()」對於用換行符寫入「errno」值很方便。 –

+0

這是問題所在!好奇的是,我發現只有幾個例子,我發現舊代碼無法工作(並且它們都是我在將它們添加爲子模塊之前克隆的子模塊)。感謝你的回答! – ben

相關問題