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