我明白错误
分段故障(堆芯转储)
串联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
)。一个好的编译器应该警告你变量的阴影。用英语写代码。迟早,你会向它展示一个不会说你的语言的人(就像你在这里做的那样),理解标识符的语义对理解代码有很大帮助。