Недавно начал работать с указателями и создал небольшой скрипт, который должен склеивать несколько текстовых файлов.
Однако, когда я пытаюсь вызвать 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, чтобы убедиться, что оно не выходит за границы массива
любая помощь вообще приветствуется! :)
Ответ 1 · рейтинг 1 · caf
Вы не можете самостоятельно выделять и копировать структуры 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);
Ответ 2 · рейтинг 1 · Nikos C.
Кажется, вам нужен динамически выделяемый массив из FILE* элементов. У вас есть:
FILE *fileStream;
Это можно рассматривать либо как указатель FILE, либо как массив из FILE элементов. Но не как массив FILE указателей. Для этого вам нужно:
FILE **fileStream;
И выделение массива должно быть выполнено с помощью:
fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE*));
FILE - это не тот тип, который вы используете напрямую. Вы всегда имеете дело с указателями на него. Вы должны относиться к нему как к непрозрачному типу.
Кроме того, я не вижу, где вы на самом деле открываете файлы (используя fopen()) где-либо в своем коде.
Ответ 3 · рейтинг 1 · user93353
Почему
char * buffer[10];
Так должно быть
char buffer[10];
Где увеличивается list->listSize?
я не понимаю что это такое
fileList.fileStream=calloc(fileList.listCapacity,sizeof(FILE));
FILE * инициализируются вызовом fopen, а не выделением памяти