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;
}

如果我没有在输出目录中手动创建名为“profiles”的文件夹,我会收到错误消息:Segmentation fault (core dumped)

如果文件夹在那里,一切正常。我该怎么做才能从代码内部创建目录?我在linux中使用gcc。谢谢。

4

2 回答 2

1

就像某些背景一样,当 fopen 尝试打开一个不存在的文件时,它不会失败,而是简单地返回 NULL。当您尝试将数据读/写到空指针时,就会发生段错误。

目录的创建和销毁在 sys/dir.h 的范围内

#include <sys/dir.h>
...
mkdir(path_str);
于 2012-09-25T00:21:03.153 回答
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 并设置;(以及大多数其他系统调用返回)返回和设置。您可以使用打印出包含错误字符串的消息:errnomkdirint-1errnoperror

#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
}
于 2012-09-25T00:22:27.507 回答