我正在使用fmemopen
创建变量FILE* fid
以将其传递给从打开文件中读取数据的函数。
在该函数的某处,它使用以下代码来查找文件的大小:
fseek(fid, 0, SEEK_END);
file_size = ftell(fid);
这适用于常规文件,但如果由fmemopen
创建的文件ID,我总是得到file_size = 8192
为什么会这样?
有没有一种方法可以获得适用于常规文件和使用fmemopen
创建的文件的正确文件大小?
修改
我打电话给fmemopen
:
fid = fmemopen(ptr, memSize, "r");
其中memSize
!= 8192
EDIT2:
我创建了一个最小的例子:
#include <cstdlib>
#include <stdio.h>
#include <string.h>
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
答案 0 :(得分:2)
如果是fmemopen
,如果您使用b
选项打开,则SEEK_END measures the size of the memory buffer。您看到的值必须是默认的缓冲区大小。
答案 1 :(得分:1)
如果opentype指定追加模式,则初始文件位置设置为缓冲区中的第一个空字符
以后:
对于打开以进行读取的流,缓冲区中的空字符(零字节)不计为“文件结尾”。只有当文件位置超过大小字节时,读操作才会指示文件结束。
似乎fseek(fid, 0, SEEK_END)
转到缓冲区的第一个零字节,而不是缓冲区的末尾。
仍在寻找适用于标准文件和fmemopen文件的方法。