Coredump в fread при указании на файл в массиве

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

Однако, когда я пытаюсь вызвать fputs, я получаю ошибку coredump/segmentation. Я подозреваю, что это из-за того, как сохраняется указатель файла. Я обнаружил, что файлы сохраняют его в массиве и пытаются получить позже.

указатель FILE сохраняется в структуре. Кто-нибудь сразу заметит мою ошибку? Я был бы очень признателен!

Структура:

typedef struct{
int listSize;
int listCapacity;
FILE *fileStream;
}FileList;

Создание структуры

FileList fileList;
fileList.listSize=0;
fileList.listCapacity=1;
fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));

а затем я добавляю структуру в массив, вызывая

void addFile(FileList* list, FILE* file)
{
    list->fileStream[list->listSize]=*file;
}

Однако, когда я звоню

char* buffer[10];
size_t result=0;

result = fread(buffer,1,10,&fileList.fileStream[ii+currentGroupOffset]);
    fputs(*buffer,outPutFile);

он падает, я пытался посмотреть значение ii+currentGroupOffset, чтобы убедиться, что оно не выходит за границы массива

любая помощь вообще приветствуется! :)


person Giffesnaffen    schedule 13.11.2012    source источник
comment
Что такое значения ii и currentGroupOffset во время вызова? Ваш массив имеет только один элемент, поэтому оба должны быть равны нулю, чтобы это работало. Как/когда называется fopen?   -  person Code Painters    schedule 13.11.2012
comment
Сохраните file, а не *file, затем используйте fileList.fileStream[...], а не &fileList.fileStream[...].   -  person Omri Barel    schedule 13.11.2012
comment
ii и currentGroupOffset оба равны 0 при первом вызове, что также является временем сбоя. Он вызывается внутри цикла for, перебирающего файлы в массиве.   -  person Giffesnaffen    schedule 13.11.2012
comment
Упс, я проглядел, что у вас есть массив FILE, а не массив FILE*, что явно неправильно. Оба ответа ниже совершенно верны! И все же, FILE* возвращается fopen(), вы когда-нибудь называли это?   -  person Code Painters    schedule 13.11.2012


Ответы (3)


Вы не можете самостоятельно выделять и копировать структуры FILE — это непрозрачный тип данных. Итак, вместо создания массива структур FILE создайте массив указателей FILE *:

typedef struct {
    int listSize;
    int listCapacity;
    FILE **fileStream;
} FileList;

FileList fileList;

fileList.listSize = 0;
fileList.listCapacity = 1;
fileList.fileStream = calloc(fileList.listCapacity, sizeof fileList.fileStream[0]);

затем добавьте указатель FILE * в массив, скопировав значение указателя:

void addFile(FileList *list, FILE *file)
{
    list->fileStream[list->listSize] = file;
}

и используйте его так:

char buffer[10];
size_t result = 0;

result = fread(buffer, 1, 10, fileList.fileStream[ii+currentGroupOffset]);
fwrite(buffer, 1, result, outPutFile);
person caf    schedule 13.11.2012

Кажется, вам нужен динамически выделяемый массив из FILE* элементов. У вас есть:

FILE *fileStream;

Это можно рассматривать либо как указатель FILE, либо как массив из FILE элементов. Но не как массив FILE указателей. Для этого вам нужно:

FILE **fileStream;

И выделение массива должно быть выполнено с помощью:

fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE*));

FILE - это не тот тип, который вы используете напрямую. Вы всегда имеете дело с указателями на него. Вы должны относиться к нему как к непрозрачному типу.

Кроме того, я не вижу, где вы на самом деле открываете файлы (используя fopen()) где-либо в своем коде.

person Nikos C.    schedule 13.11.2012

Почему

char * buffer[10];

Так должно быть

char buffer[10];

Где увеличивается list->listSize?

я не понимаю что это такое

 fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));

FILE * инициализируются вызовом fopen, а не выделением памяти

person user93353    schedule 13.11.2012