创建目录时出现分段错误(核心转储)

时间:2012-09-24 23:59:55

标签: c directory segmentation-fault

我有这个简单的代码:

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。 感谢。

2 个答案:

答案 0 :(得分:1)

正如一些背景知识,当fopen尝试打开不存在的文件而不是失败时,它只返回NULL。当您尝试读取/写入空指针时,会发生seg错误。

目录的创建和销毁属于sys / dir.h领域。

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

答案 1 :(得分: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
}