查找由fmemopen创build的文件的大小

我正在使用fmemopen创build一个variablesFILE* fid将其传递给一个函数从打开的文件中读取数据。

在这个函数的某个地方,它使用下面的代码来找出文件的大小:

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

这在常规文件的情况下效果很好,但是在由fmemopen创build的文件ID的情况下,我总是得到file_size = 8192

任何想法为什么发生这种情况 有没有一种方法来获得适用于常规文件和用fmemopen创build的文件的正确的文件大小?

编辑:我打电话给fmemopen

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

memSize != 8192

EDIT2:

我创build了一个最小的例子:

 #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

Solutions Collecting From Web of "查找由fmemopen创build的文件的大小"

fmemopen情况下,如果使用选项b打开,则fmemopen将测量内存缓冲区的大小 。 您看到的值必须是默认的缓冲区大小。

好吧,我已经得到了自己解决的这个谜团。 该文件说:

如果opentype指定了append模式,则初始文件位置设置为缓冲区中的第一个空字符

然后:

对于打开读取的流,缓冲区中的空字符(零字节)不计为“文件结尾”。 仅当文件位置超过大小字节时,读取操作才会指示文件的结尾。

似乎fseek(fid, 0, SEEK_END)进入缓冲区中的第一个零字节,而不是缓冲区的末尾。

仍然在寻找一种可以在标准和fmemopen文件上工作的方法。