Я использую этот код для чтения файла:Ошибка при чтении файла с «fgetc» (Overflow)
char* fs_read_line(FILE* file)
{
if (file == NULL) {
return "CFILEIO: Error while reading the file: Invalid File";
}
long threshold = ftell(file);
fseek(file, 0, SEEK_END);
uint8_t* buffer = calloc(ftell(file)-threshold, sizeof(uint8_t));
if(buffer == NULL)
return;
int8_t _;
fseek(file, threshold, SEEK_SET);
uint32_t ct = 0;
while ((_ = (char)(fgetc(file))) != '\n'
&& _ != '\0' && _ != '\r' && _ != EOF) {
buffer[ct++] = _;
}
buffer = realloc(buffer, sizeof *buffer * (ct + 1));
buffer[ct] = '\0';
return buffer;
}
Если файл слишком большой, я получаю (кучи) ошибки переполнения, вероятно, потому, что я сначала выделите файл с общим количеством содержащихся в нем символов.
Другой способ, который я пытался сделать, это realloc
буфер после каждой итерации, но это не тот подход, который я хочу.
Есть ли способ динамически изменять размер массива в зависимости от текущей итерации, не всегда uisng realloc
? или есть ли способ определить, как долго текущая линия использует ftell
и fseek
?
код вы показываете не компилировать в C++. Не добавляйте несвязанные теги. –
'sizeof (uint8_t *)' дает вам размер указателя, а не размер одного байта. Который почти полностью определен только 1 в системе, где 'uint8_t' существует. Таким образом, вы выделяете в 4 или 8 раз больше размера файла, а затем не проверяете, успешно ли это распределение. –
Вместо 'memset',' buffer [ct ++] = _' намного яснее. –