2012-09-24 76 views
0

當我有這個簡單的代碼:分割故障(核心轉儲)創建目錄

int read_data(int GrNr) { 
    //many lines of code 
    fprintf(fdatagroup, "%i", Ngroups); 
    return 0; 
} 

int main(int argc, char **argv) { 
    for(NUM=NUM_MIN;NUM<=NUM_MAX;NUM++) { 
     sprintf(groupfile,"../output/profiles/properties_%03d.txt", NUM); 
     fdatagroup = fopen(groupfile,"w"); 

     GROUP=0; 
     accept=0; 

     do { 
      check=read_data(GROUP); 
      printf("check = %d \n", check); 

      accept++; 
      FOF_GROUP++; 
     } 
     while (accept<=n_of_halos); 

     fclose(fdatagroup); 
    } 
    printf("Everything done.\n"); 
    return 0; 
} 

如果我不手動創建我的輸出目錄中稱爲「配置文件」的文件夾我得到 錯誤:Segmentation fault (core dumped)

如果文件夾在那裏,一切工作正常。 我能做些什麼來創建代碼中的目錄? 我在linux中使用gcc。 謝謝。

+0

參見:[MKDIR(http://www.kernel.org/doc/man-pages/online/pages/man2/mkdir。 2.html) – verdesmarald

+0

我*討厭*當人們不檢查錯誤'fopen()':( – paulsm4

回答

1

就像一些背景一樣,當fopen試圖打開一個不存在的文件,而不是失敗時,它只是返回NULL。當你嘗試讀/寫數據到一個空指針時,會發生seg故障。

創建和目錄的破壞在於SYS的範疇/ dir.h

#include <sys/dir.h> 
... 
mkdir(path_str); 
+0

並且請,如果你不喜歡神祕的段錯誤也使用snprintf()而不是sprintf()。 – Gilbert

+0

你可以解釋一下我的意思嗎?它有什麼區別?它是如何幫助我的? – Santi

+0

他的問題不是'sprintf' ... plus ,如果只打印數字,則可以保證每個數字輸出的輸出字符串長度不會超過16個字符。 – nneonneo

1

在Linux上:

#include <sys/stat.h> 
#include <sys/types.h> 

mkdir("/path/to/dir", 0777); // second argument is new file mode for directory (as in chmod) 

你也應該始終檢查功能衰竭。如果無法打開文件,則fopen返回NULL並設置errno; mkdir(和大多數其他系統調用返回int)返回-1並設置errno。您可以使用perror打印出包含錯誤字符串消息:

#include <errno.h> 

if(mkdir("/path", 0777) < 0 && errno != EEXIST) { // we check for EEXIST since maybe the directory is already there 
    perror("mkdir failed"); 
    exit(-1); // or some other error handling code 
}