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 に答える