在C中将打开的文件作为参数传递

Cri*_*jon 0 c file

我收到了错误

分段故障(核心转储)

排队 fread(&libro, sizeof(struct Libro), 1, archivo);

当我运行以下代码时:

#include <stdio.h>

void abrirArchivo(FILE *archivo);
void cerrarArchivo(FILE *archivo);
void listar(FILE *archivo);

struct Libro {
   char isbn[ 13 ];     /* número de libro */
   char nombre[ 30 ];   /* nombre de libro */
   char autor[ 30 ];    /* nombre del autos */
   int edicion;         /* edicion */ 
};

FILE *archivo;     /* archivo = puntero al archivo clientes.dat */

int main()
{
    abrirArchivo(archivo);
    listar(archivo);
    cerrarArchivo(archivo);

    return 0; /* indica terminación exitosa */
}

void abrirArchivo(FILE *archivo){
    if ( ( archivo = fopen( "libros.dat", "rb" ) ) == NULL ) {
       printf( "El archivo no pudo abrirse" );
    }
}

void cerrarArchivo(FILE *archivo){
    fclose(archivo);
}

void listar(FILE *archivo){
    struct Libro libro;

    printf("ISBN\tNombre\tAutor\tEdicion\n");

    fread(&libro, sizeof(struct Libro), 1, archivo);

    while(!feof(archivo)){
        printf("%s\t\t%s\t\t%s\t%d\n", libro.isbn, libro.nombre, libro.autor, libro.edicion);
        fread(&libro, sizeof(struct Libro), 1, archivo);
    }

}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

小智 7

FILE *archivo;     /* archivo = puntero al archivo clientes.dat */

[...]

void abrirArchivo(FILE *archivo){
    if ( ( archivo = fopen( "libros.dat", "rb" ) ) == NULL ) {
       printf( "El archivo no pudo abrirse" );
    }
}
Run Code Online (Sandbox Code Playgroud)

在此功能,参数 archivo 阴影变量archivo在文件范围内,这是一个不同的变量.当调用它时,你传递全局archivo,但是函数接收它的副本并分配给archivo函数退出时不再存在的副本(本地).

简单的解决方案:完全从该函数中删除参数.稍微好一点:使返回FILE *打开它并没有考虑的参数.


附注:

  • 编译并启用足够的警告(例如gcc使用-std=c11 -Wall -Wextra -pedantic).一个好的编译器应该警告你有关变量的阴影.

  • 用英语写你的代码.迟早,你会向他展示一个不会说你的语言的人(就像你在这里做的那样),理解标识符的语义对理解代码有很大帮助.