【问题标题】:Global file pointer declaration in CC中的全局文件指针声明
【发布时间】:2013-03-05 16:10:02
【问题描述】:

全局文件指针声明存在一些问题,因此我遇到了分段错误。 GDB 表明它专门出现在 sourceToStream 函数中的 fscanf 行。任何帮助将不胜感激。

#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;
}

【问题讨论】:

  • fopen() 成功了吗?
  • 我不知道Mike为什么删除了他的评论,但是你为什么不检查fopen的返回值呢?
  • 有两个fscanf
  • GDB在执行第一个fopen()(gdb) p in_fp $1 = (FILE *) 0x0 (gdb) p *in_fp Cannot access memory at address 0x0后给出以下输出
  • @user42933,然后fopen() 失败,因为它在失败时返回NULL。始终检查 IO 操作的结果。

标签: c file pointers global


【解决方案1】:

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

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

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

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

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

例如,如果该文件不存在,您会得到如下信息:

打开源失败:没有那个文件或目录

【讨论】:

  • 实际上,要打开的文件必须在当前工作目录中,这不一定与代码所在的目录一致。否则 +1。
  • @bitmask - 很好,我假设源代码、二进制文件和文本都只是转储在同一个地方,但事实并非如此。已更新。
  • 你为什么要参考 cplusplus.com 的 C 函数?更不用说 cplusplus.com 通常被认为充满了不精确的信息,无论如何都应该避免。
  • @Shahbaz - 我的几个朋友(他们正在开始编码)告诉我,他们发现它比man page 更容易阅读,并且喜欢它包含几乎所有内容的示例,其中因为手册页被击中或错过。因此,当信息正确时,我倾向于链接到那些……而且我相信这些信息对于 C 是正确的,并且通常在 fopen()cplusplus.com 页面上
  • return EXIT_FAILURE;exit(EXIT_FAILURE);return -1; 更有意义
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2015-05-02
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多