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

时间:2017-11-07 14:29:09

标签: c file

我收到错误

  

分段错误(核心转储)

warning('hello world 1'); warning('hello world 2'); warning('hello world 3');

当我运行以下代码时:

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

我做错了什么?

3 个答案:

答案 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 ;
}