Проблема в открытии файла внутри функции, вылетает консоль
Это модуль, как только перестаю открывать файл внутри главного модуля консоль крашится, хочу написать функцию открытия файла и его проверки.
#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 шт):
Это ужасно! Не используйте 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()
}
Вот вчерашний код, который я вам писал, но с вашей функцией:
#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