Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение/запись структур в двоичный файл 
V
    Опции темы
Sturmvogel
Дата 14.8.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Добрый день.
Возникла такая проблема:
При попытку считать структуру из ранее созданного файла возникает ошибка чтения.
При этом при проходе отладчиком ошибка отлавливается и выводится сообщение, а при запуску exe через консоль программа рушится.
ОС: Windows 7
IDE: NetBeans 6.9+mingw
Код

#include "operations.h"

//Структура, описывающая входной файл
#pragma pack(push,1)
struct fileData
{
    //Размер файла
    int size_in;
    //Имя файла
    char* fn_in;
};
#pragma pack(pop)

//Добавление файла в архив
void addFile(char *in, char *out)
{
    fileData data;
    FILE *inf,*outf;
    char *buf;
    if((inf=fopen(in,"rb"))==NULL)
        cout<<"Can't open input file "<<in<<endl;
    if((outf=fopen(out,"ab"))==NULL)
        cout<<"Can't open output file "<<out<<endl;

    data.fn_in=in;
    //Определение размера файла
    fseek(inf,0,SEEK_END);
    data.size_in=ftell(inf);
    rewind(inf);

    if((fwrite(reinterpret_cast<char*>(&data),sizeof(data),1,outf))==0)
        cout<<"Can't write to file "<<out<<endl;
    for(int i=0;i<data.size_in;i++)
    {
        if((fread(reinterpret_cast<char*>(&buf),1,1,inf))==0)
            cout<<"Can't read from file "<<in<<endl;
        if((fwrite(reinterpret_cast<char*>(&buf),1,1,outf))==0)
            cout<<"Can't write to file "<<out<<endl;
    }
    fclose(inf);
    fclose(outf);
}

//Извлечение всех файлов из архива
void extractAllFiles(char *in)
{
    fileData data;
    data.fn_in="empty";
    data.size_in=-1;
    FILE *inf,*outf;
    char *buf;
    if((inf=fopen(in,"rb"))==NULL)
        cout<<"Can't open input file "<<in<<endl;
//Здесь возникает ошибка
    if((fread(reinterpret_cast<char*>(&data),sizeof(data),1,inf))==0)
            cout<<"Can't read from file "<<in<<endl;
    cout<<data.fn_in<<" "<<data.size_in<<endl;
    fclose(inf);
}

PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



fileData содержит указатель.
проверь результат sizeof(fileData)

для подобных операций, правильнее, использовать сериализацию. смотри boost.serialization
PM WWW   Вверх
Sturmvogel
Дата 14.8.2010, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Результат sizeof(data) равен 8, и, как я полагаю, это реальный размер структуры.
Да и к тому же подобных примеров в интернете довольно много, и довольно странно, что у меня это не работает:(
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Sturmvogel @  14.8.2010,  19:18 Найти цитируемый пост)
Результат sizeof(data) равен 8

ага. только вот вы скажите, как вы предполагаете, то, на что указывает указатель, само должно в файл записаться? smile 
PM WWW   Вверх
Sturmvogel
Дата 14.8.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Цитата(boostcoder @ 14.8.2010,  19:31)
Цитата(Sturmvogel @  14.8.2010,  19:18 Найти цитируемый пост)
Результат sizeof(data) равен 8

ага. только вот вы скажите, как вы предполагаете, то, на что указывает указатель, само должно в файл записаться? smile

Что-то я не понял. Ведь, как я понимаю, функция fwrite должна записать структуру, на которую ссылается указатель. Так в чём здесь ошибка????
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



Цитата(Sturmvogel @  14.8.2010,  22:09 Найти цитируемый пост)
Так в чём здесь ошибка?

в том, что в структуре указатель.
PM WWW   Вверх
Sturmvogel
Дата 14.8.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Ага. Но тогда как в таком случае записать структуру, в которой содержатся и указатели и переменные?
PM MAIL   Вверх
boostcoder
Дата 14.8.2010, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



записывать так:
Код

int len = strlen(data.fn_in)+1; // +1 для завершающего нуля
fwrite(&len, sizeof(len), 1, outf);
fwrite(data.fn_in, len, 1, outf);


читать так:
Код

int len;
fread(&len, sizeof(len), 1, inf);
data.fn_in = (char*)malloc(len);
fread(data.fn_in, len, 1, inf);


только не забывай память освобождать.
PM WWW   Вверх
Sturmvogel
Дата 14.8.2010, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Огромное спасибо, всё заработало!
Жаль что нет возможности записать такую структуру целиком.

PM MAIL   Вверх
Dem_max
Дата 15.8.2010, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Жаль что нет возможности записать такую структуру целиком.

Можно, храни в структуре не указатели, а  

Код

struct fileData
{
    //Размер файла
    int size_in;
    //Имя файла
    char fn_in[MAX_FILE];
};

тады и проблем не будет с чтением и записью в файл.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Sturmvogel
Дата 15.8.2010, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 14.8.2010

Репутация: нет
Всего: нет



Ну про этот вариант я тоже думал, но в моём случае всё таки удобнее по частям обрабатывать структуру, т.к. в последствии придётся очень часто преобразованиями типов пользоваться, а это не так удобно да и менее надёжно...

Это сообщение отредактировал(а) Sturmvogel - 15.8.2010, 15:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2504 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.