C中的全局文件指针声明

时间:2013-03-05 16:10:02

标签: c file pointers global

全局文件指针声明存在一些问题,因此我遇到了分段错误。 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;
}

1 个答案:

答案 0 :(得分:2)

  

GDB在执行第一个fopen()后给出以下输出(gdb)p in_fp $ 1 =(FILE *)0x0
(gdb)p * in_fp无法访问地址0x0处的内存

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

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

对于fopen(),您可以检查生成的文件句柄是否为NULL,然后打印出错误消息:

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

例如,如果文件不存在,您将获得类似的内容:

  

无法打开源:没有此类文件或目录