Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Fread и указатель на структуры в функциях

Автор вопроса: AgheroОтветов: 1

Я работаю над программой чтения растровых изображений. Дело в том, что я написал все в 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;
}
  • Вам будет легче помочь, если вы не используете польский язык в коде. Everettss 14.06.2016
  • fread считывает данные из заданного потока в массив. Однако в вашем коде первым аргументом fread является структура. Это проблематично из-за проблемы заполнения; лучший подход - прочитать заголовок файла в массив unsigned char. mw215 15.06.2016
  • Взгляните на это. mw215 15.06.2016
  • Спасибо за вашу помощь. Да мой плохой. В следующий раз я переведу все имена на английский язык. Простите за это Aghero 15.06.2016

cstructurepointersfread

Ответы

Ответ 1 · dbush

fread нужен адрес буфера. Итак, во второй попытке передайте адрес fheader->sygnatura:

fread(&fheader->sygnatura,2,1,fp1);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы