Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2012, 17:04   #1
SamVImes
Новичок
Джуниор
 
Регистрация: 20.08.2012
Сообщений: 4
Вопрос чтение структуры из файла (язык С)

Добрый день. Я пишу архиватор на С и столкнулся с вроде бы привычной и простой в исправлении ошибкой - Segmentation Fault.

Код:
void readMetaData(ArchiveMetaData* metaData, FILE* file) {
    unsigned int fileCount = readUInt(file);
    metaData->fileCount = fileCount;
    metaData->descriptors = (FileDescriptor**)malloc(sizeof(FileDescriptor) * metaData->fileCount);
    for (unsigned int i = 0; i < fileCount; i++){
        metaData->descriptors[i]->nextDescriptorOffset = readUChar(file);
        metaData->descriptors[i]->fileSize = readULongLong(file);
        metaData->descriptors[i]->fileDataOffset = readULongLong(file);
        fscanf(file, metaData->descriptors[i]->fileName);
    }

}
Структуры выглядят так:

Код:
struct FileDescriptor {
    unsigned char nextDescriptorOffset;
    unsigned long long fileSize;
    unsigned long long fileDataOffset;
    char* fileName;
};

struct ArchiveMetaData {
    unsigned int fileCount;
    FileDescriptor** descriptors;
};
падает на выделенной красным строчке

Заранее спасибо)
SamVImes вне форума Ответить с цитированием
Старый 20.08.2012, 17:23   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от SamVImes Посмотреть сообщение
Код:
void readMetaData(ArchiveMetaData* metaData, FILE* file) {
    unsigned int fileCount = readUInt(file);
    metaData->fileCount = fileCount;
    metaData->descriptors = (FileDescriptor**)malloc(sizeof(FileDescriptor) * metaData->fileCount);
    for (unsigned int i = 0; i < fileCount; i++){
        metaData->descriptors[i]->nextDescriptorOffset = readUChar(file);
        metaData->descriptors[i]->fileSize = readULongLong(file);
        metaData->descriptors[i]->fileDataOffset = readULongLong(file);
        fscanf(file, metaData->descriptors[i]->fileName);
    }

}
В выделенной строчке ошибка.
http://cplusplus.com/reference/clibrary/cstdio/fscanf/
Ни память не выделяете, ни строку форматирования не указали.

...

И почему FileDescriptor**? Достаточно одной звёздочки. И тогда доступ к элементам производить через точку, а не стрелку.
Код:
    metaData->descriptors = (FileDescriptor*)malloc(sizeof(FileDescriptor) * metaData->fileCount);
...
        metaData->descriptors[i].nextDescriptorOffset = readUChar(file);
...

struct ArchiveMetaData {
    unsigned int fileCount;
    FileDescriptor* descriptors;
};

Последний раз редактировалось netrino; 20.08.2012 в 17:27.
netrino вне форума Ответить с цитированием
Старый 20.08.2012, 17:39   #3
SamVImes
Новичок
Джуниор
 
Регистрация: 20.08.2012
Сообщений: 4
По умолчанию

хм, но я же не знаю сколько выделять + падает раньше

Код:
metaData->descriptors[i]->nextDescriptorOffset = readUChar(file);
SamVImes вне форума Ответить с цитированием
Старый 20.08.2012, 18:43   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Это не повод не выделять вообще, так как будет всё тот же Segmentation Fault. Если не знаете сколько, значит нужно выделять с запасом. А падает раньше именно из-за стрелочки. Нужно либо убрать одну звёздочку, как я указал в предыдущем посте, либо выделить память под каждый дескриптор отдельно.
Код:
    metaData->descriptors = (FileDescriptor**)malloc(sizeof(FileDescriptor*) * metaData->fileCount);
    for (unsigned int i = 0; i < fileCount; i++){
        metaData->descriptors[i] = (FileDescriptor*)malloc(sizeof(FileDescriptor));
        metaData->descriptors[i]->nextDescriptorOffset = readUChar(file);
      ...
    }
netrino вне форума Ответить с цитированием
Старый 20.08.2012, 18:59   #5
SamVImes
Новичок
Джуниор
 
Регистрация: 20.08.2012
Сообщений: 4
По умолчанию

спасибо большое)
SamVImes вне форума Ответить с цитированием
Старый 20.08.2012, 19:18   #6
SamVImes
Новичок
Джуниор
 
Регистрация: 20.08.2012
Сообщений: 4
По умолчанию

даа, всё заработало) выделил память под каждый дескриптор отдельно (к сожалению нужно использовать массив указателей). В общем огромное спасибо, целый день тупил я!)
SamVImes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение структуры из файла! Olegzxc Общие вопросы C/C++ 1 01.12.2011 00:40
Чтение структуры из файла atenon Общие вопросы C/C++ 11 22.10.2010 20:35
Чтение из файла(язык С) Naper214 Помощь студентам 5 12.04.2010 00:11
Запись структуры и чтение из файла [MI_nor] Общие вопросы C/C++ 6 08.04.2009 15:52
Чтение структуры файла SDK Помощь студентам 4 23.01.2008 19:30