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 处的内存后,GDB 给出以下输出

这意味着您的文件没有正确打开,或者更具体地说, source_code.txt 没有打开以供阅读。

由于您没有在打开命令中包含路径,因此请确保它们位于当前工作目录(您从中执行二进制文件的目录)并确保您具有读/写权限。

因为fopen()您可以检查生成的文件句柄是否为 NULL,如果是则打印错误消息:

    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 回答