我收到错误
分段错误(核心转储)
在warning('hello world 1');
warning('hello world 2');
warning('hello world 3');
行
当我运行以下代码时:
fread(&libro, sizeof(struct Libro), 1, archivo);
我做错了什么?
答案 0 :(得分: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" );
}
}
在此函数中,参数 archivo
阴影变量archivo
在文件范围内,它是一个不同的变量。调用它时,您传递全局archivo
,但该函数会收到它的副本并分配给该函数退出时不再存在的副本(本地archivo
)。
简单的解决方案:完全从该函数中删除参数。稍微好一些:让它返回它打开的FILE *
并且不要参数。
附注:
在启用足够警告的情况下进行编译(例如gcc
使用-std=c11 -Wall -Wextra -pedantic
)。一个好的编译器应该警告你有关变量的阴影。
将您的代码写成英文。迟早,你会向某人展示一个不会说你的语言的人(就像你在这里做的那样),理解标识符的语义对理解代码有很大的帮助。
答案 1 :(得分:1)
你需要这个:
...
FILE *archivo; /* archivo = puntero al archivo clientes.dat */
abrirArchivo(&archivo);
...
void abrirArchivo(FILE **archivo)
{
if ( ( *archivo = fopen( "libros.dat", "rb" ) ) == NULL ) {
...
}
在调用archivo
后,您的解决方案abrirArchivo(archivo)
将不会被修改。
答案 2 :(得分:0)
你的程序正在遭遇阴影全球指针。
尝试将全局文件指针移动到main
。
稍微更改abrirArchivo( FILE *)
功能。
一个选项如下。
// FILE *archivo; /* archivo = puntero al archivo clientes.dat */
int main()
{
FILE *archivo = abrirArchivo( );
if( arvhivo )
{
listar(archivo);
cerrarArchivo(archivo);
}
return 0; /* indica terminación exitosa */
}
FILE *abrirArchivo(){
FILE *archivo = NULL
if ( ( archivo = fopen( "libros.dat", "rb" ) ) == NULL ) {
printf( "El archivo no pudo abrirse" );
}
return archivo ;
}