OpenFile函数打开文件ok但返回NULL指针(C程序)

时间:2017-12-04 15:27:21

标签: c linux

我的C代码遇到了一些麻烦,并决定在这里向大师们询问我做错了什么。

//
// Routines.c
//

#include <stdio.h>
#include <errno.h>

...

int OpenFile(FILE * fd, char * nm, char * md){
    FILE *rc; 
    printf("nm = %s, md = %s\n", nm, md);
    fd = fopen(nm, md);
    printf("fd fopen... errno = %d\n", errno);
    if ( fd == NULL ) {
        *rc = errno;
        printf("fopen %s -> rc = %d\n", nm, *rc);
        return rc;
    }
    printf("fd not NULL !!!\nrc = %d e errno = %d\n", *rc, errno);
    return 0;
}

...

int Generate (char * v) {
    int rc = 0;
    FILE *fd;

    rc = OpenFile (fd, v, "w");
    if ( rc ){
        printf ("open file error. RC = %d", rc);
        return rc;
    }
    if (fd == NULL){
        printf ("fd NULL !!!\n");
        return 1;
    }

    CloseFile(fd);
    printf("Closed fd\n");

    printf("Leaving Generate. RC = %d\n",rc);
    return rc;
}

...

这个Routines.c是这样制作的:

gcc -Wall -g -O0 -pedantic -fPIC -c Routines.c -o Routines.o

=============================================== =================

//
// Caller.c
//

#include <stdio.h>
#include <string.h>

#include "Routines.h"

....

int main (int argc, char **argv) {
    ....
    char * v = "msgs.txt";

    ....

    Generate(v);

    ....

    return 0;
}

这个Caller.c是这样制作的:

gcc -Wall -g -O0 -fno-stack-protector -fPIC -c Caller.c
gcc -Wall -g -O0 -fno-stack-protector -fPIC -o Caller Caller.o Routines.o

=============================================== =================

两个c文件都编译为零错误(也没有警告)。

- 执行 -

  

来自OpenFile()的消息(即文件已正确打开)

nm = msgs.txt,md = w fd fopen ... errno = 0 fd不是空!!! rc = 0 e errno = 0

  

来自OpenFile()的消息(这里发生了什么?)

fd NULL !!!

有人可以告诉我返回给Caller的文件处理程序发生了什么 as NULL,当它在文件打开的Routines上正确设置???

要解决我的问题,我必须这样做:

FILE * OpenFile(char * nm, char * md, int * rc){

fd = OpenFile (v, "w", &rc);

但是我想冷静下来,明白我到底发生了什么事。

提前谢谢(很多)。

1 个答案:

答案 0 :(得分:3)

FILE * fd中的

OpenFile()是包含指向文件的指针的局部变量。您正在更改本地函数范围内的指针 - 这些信息都不会超出您的OpenFile()函数。