Я работаю над программой чтения растровых изображений. Дело в том, что я написал все в main и мне нужно разложить код по функциям. Я читаю информацию, используя fread, используя стандартную адресацию структуры, но я почему-то не могу получить доступ к информации после выхода из функции. Итак, я попытался обратиться к структуре с помощью указателей, но fread не позволяет мне это сделать. Я читал, что fread не предназначен для этого с помощью указателей. Но я не могу это подтвердить. И это мой вопрос. Как это сделать с помощью указателей? И почему моя первая попытка не работает вне функции?
void odczyt_pliku_bmp(struct FileHeader fheader, struct MapHeader mheader, char *nazwa) {
FILE *fp1;
fp1 =fopen(nazwa,"rb");
if(fp1)
{
fread(&fheader.sygnatura,2,1,fp1);
//...
printf("%d\n",fheader.sygnatura);//Checking. Everything seems right there
}
else
{
printf("Error");
}
fclose(fp1);
}
И главное:
int main() {
struct FileHeader fheader;
struct MapHeader mheader;
char nazwapliku, *wczyt_nazwa =&nazwapliku;
printf("Podaj nazwe pliku bitmapy: ");
scanf("%s",wczyt_nazwa);
odczyt_pliku_bmp(fheader, mheader, wczyt_nazwa);
printf("%d\n",fheader.sygnatura);// And there is random trash
return 0;
}
Еще одна попытка использования указателей:
void odczyt_pliku_bmp(struct FileHeader *fheader, struct MapHeader *mheader, char *nazwa) {
FILE *fp1;
fp1 =fopen(nazwa,"rb");
if(fp1)
{
fread(fheader->sygnatura,2,1,fp1);
//...
printf("%d\n",fheader->sygnatura);
}
else
{
printf("Error");
}
fclose(fp1);
}
Снова основной для второго метода:
int main() {
struct FileHeader fheader;
struct MapHeader mheader;
char nazwapliku, *wczyt_nazwa =&nazwapliku;
printf("Podaj nazwe pliku bitmapy: ");
scanf("%s",wczyt_nazwa);
odczyt_pliku_bmp(&fheader, &mheader, wczyt_nazwa);
printf("%d\n",fheader.sygnatura);
return 0;
}
freadсчитывает данные из заданного потока в массив. Однако в вашем коде первым аргументомfreadявляется структура. Это проблематично из-за проблемы заполнения; лучший подход — прочитать заголовок файла в массивunsigned char. - person mw215   schedule 15.06.2016