我有这个简单的代码:
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。谢谢。
就像一些背景一样,当fopen尝试打开一个不存在的文件时,它不会失败,而是简单地返回NULL。 然后,当您尝试将数据读/写到空指针时,会发生 seg 错误。
目录的创建和销毁属于 sys/dir.h 的范畴
#include <sys/dir.h>
...
mkdir(path_str);
在 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
}