我明白错误
分段故障(堆芯转储)
串联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);
    }

}

我做错什么了?

最佳答案

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" );
    }
}

在这个函数中,参数archivo在文件范围内隐藏变量archivo,它是一个不同的变量。调用此函数时,您将传递全局archivo,但函数接收到它的副本,并将其分配给复制(本地archivo),该函数在函数退出时不再存在。
简单的解决方法:从函数中完全删除参数。稍微好一点:让它返回它打开的FILE *并且不带参数。
旁注:
编译时启用足够的警告(例如对于gcc使用-std=c11 -Wall -Wextra -pedantic)。一个好的编译器应该警告你变量的阴影。
用英语写代码。迟早,你会向它展示一个不会说你的语言的人(就像你在这里做的那样),理解标识符的语义对理解代码有很大帮助。

10-08 07:36