Проблема в открытии файла внутри функции, вылетает консоль

Это модуль, как только перестаю открывать файл внутри главного модуля консоль крашится, хочу написать функцию открытия файла и его проверки.

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "funcv.h"
void openr(FILE *a, char z[10] )
{
using namespace std;
a=fopen(z,"r+");
if(a)
goto zzz;
else
{
while(!a)
{
cout<<"Введите название файла еще раз:";
gets(z);
a=fopen(z, "r+");
}
goto zzz;
}
zzz: cout<<"Успешно открыто"<<endl;

}


Ответы (2 шт):

Автор решения: DmitryK

Это ужасно! Не используйте goto без надобности. В идеале - никогда!
Вот эта функция без goto

void openr(FILE *a, char z[10] )
{
    a=fopen(z,"r+");
    while(!a)
    { 
        cout<<"Введите название файла еще раз:";
        gets(z);
        a=fopen(z, "r+");
    }
    cout<<"Успешно открыто"<<endl;
}

Из формулировки вопроса с трудом понятна проблема.
Но скорее всего дело в том, что вы передаете в функцию указатель на файл по значению. После того как в функции вы открываете файл, указатель на открытый файл сохраняется в локальной переменной a=fopen(z,"r+"); и его значение никак не попадает в вызывающий код, например в main(). И пытаясь в main() что-то прочитать из файла по указателю, который не указывает на открытый файл, происходит ошибка.
В данном случае нужно возвращать указатель на файл либо передавать в функцию указатель на файл по ссылке:

FILE* openr( const char* name ){} // возвращает указатель на открытый файл
main()
{ 
  FILE* myfile = openr("myfile.txt");
}

// ---------------------------------

void openr(FILE& *f, const char* name ){} // получает указатель по ссылке
main()
{ 
  FILE* myfile = NULL;
  openr( myfile, "myfile.txt"); // передача по ссылке, чтобы изменилось значение в main()
}

→ Ссылка
Автор решения: DmitryK

Вот вчерашний код, который я вам писал, но с вашей функцией:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

struct A
{
    int a;
    int b;
    char c;
};

FILE* openr( char* name ) // возвращает указатель на открытый файл
{
    FILE* fd = fopen(name, "rb");
    while(!fd)
    { 
        cout<<"Введите название файла еще раз:"<<endl;
        gets(name);
        fd = fopen( name, "rb");
    }
    return fd;
} 

int main()
{
  FILE *fd;
  char name[256] = "f001.bin";
  int size = 3;
  A mass[size] = {
      { 1, 2, 'a'},
      { 3, 4, 'b'},
      { 5, 6, 'c'}
  };
  
  A mass1[size];
  
  fd = fopen(name, "wb");
  fwrite(mass, sizeof(mass[0]), size, fd);
  fclose(fd);
  
  fd = openr(name);
  fread(mass1, sizeof(mass1[0]), size, fd);
  fclose(fd);
  
  for(int i=0; i<size; i++)
  {
      cout<< mass1[i].a << " " << mass1[i].b << " " << mass1[i].c << "\n";
  }
  
}

gets лучше не использовать.
Вместо нее используйте getline https://en.cppreference.com/w/c/experimental/dynamic/getline

→ Ссылка