1

グローバルファイルポインタ宣言に問題があり、その結果、セグメンテーション違反が発生します。GDBは、それが関数のfscanf行で具体的に発生することを示しましたsourceToStream。どんな助けでもいただければ幸いです。

#define SOURCE_CODE "source_code.txt"           
#define CHARACTER_STREAM "character_stream.txt"

static FILE* in_fp;
static FILE* out_fp;

void sourceToStream() {
    char buf;

    while(fscanf(in_fp, "%c", &buf) != EOF) {
        if (buf == '\%')
            while(buf!='\n' && buf !='\r' && buf!=EOF)
                fscanf(in_fp, "%c", &buf);

        if(buf != '\n' && buf != '\r' && buf != '\t' && buf != ' ')
            fprintf(out_fp, "%c", buf);
    }
}

int main() {

    in_fp = fopen(SOURCE_CODE, "r");
    out_fp = fopen(CHARACTER_STREAM, "w");

    sourceToStream();

    fclose(in_fp);
    fclose(out_fp);

    return 0;
}
4

1 に答える 1

2

最初の fopen()
(gdb) p in_fp $1 = (FILE *) 0x0
(gdb) p *in_fp アドレス 0x0 のメモリにアクセスできません。

これは、ファイルが正しく開かれていないか、より具体的には source_code.txt が読み取り用に開かれていないことを意味します。

open コマンドにパスが含まれていないため、それらが現在の作業ディレクトリ (バイナリを実行しているディレクトリ) にあることを確認し、読み取り/書き込み権限があることを確認してください。

結果のファイルハンドルが NULL かどうかを確認し、fopen()次の場合はエラーメッセージを出力できます。

    in_fp = fopen(SOURCE_CODE, "r");
    if(in_fp == NULL) {
        perror("Failed to open the source");
        return EXIT_FAILURE;
    }

たとえば、ファイルが存在しない場合は、次のようになります。

ソースを開けませんでした: そのようなファイルまたはディレクトリはありません

于 2013-03-05T16:18:16.363 に答える