Поиск размера файла, созданного fmemopen

Я использую fmemopen для создания переменной FILE* fid чтобы передать ее функции, которая считывает данные из открытого файла.

Где-то в этой функции он использует следующий код, чтобы узнать размер файла:

 fseek(fid, 0, SEEK_END); file_size = ftell(fid); 

это хорошо работает в случае обычных файлов, но в случае идентификаторов файлов, созданных fmemopen я всегда получаю file_size = 8192

Любые идеи, почему это происходит? Есть ли способ получить правильный размер файла, который работает как для обычных файлов, так и для файлов, созданных с помощью fmemopen ?

EDIT: мой звонок fmemopen :

 fid = fmemopen(ptr, memSize, "r"); 

где memSize ! = 8192

EDIT2:

Я создал минимальный пример:

 #include  #include  #include  using namespace std; int main(int argc, char** argv) { const long unsigned int memsize = 1000000; void * ptr = malloc(memsize); FILE *fid = fmemopen(ptr, memsize, "r"); fseek(fid, 0, SEEK_END); long int file_size = ftell(fid); printf("file_size = %ld\n", file_size); free(ptr); return 0; } 

Кстати, я в настоящее время работаю на другом компьютере, и здесь я получаю file_size = 0

В случае fmemopen , если вы откроете с помощью опции b SEEK_END измеряет размер буфера памяти . Значение, которое вы видите, должно быть размером буфера по умолчанию.

Хорошо, я решил эту тайну самостоятельно. В документации говорится:

Если opentype указывает режим добавления, тогда исходная позиция файла устанавливается на первый нулевой символ в буфере

и позже:

Для streamа, открытого для чтения, нулевые символы (нулевые байты) в буфере не считаются «окончанием файла». Операции чтения указывают конец файла только тогда, когда позиция файла предшествует байтам размера прошлого.

Похоже, что fseek(fid, 0, SEEK_END) переходит в первый нулевой байт в буфере, а не в конец буфера.

Ищете метод, который будет работать как с стандартными файлами, так и с файлами fmemopen.