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

时间:2012-11-20 11:27:58

标签: c linux stdio

我正在使用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

2 个答案:

答案 0 :(得分:2)

如果是fmemopen,如果您使用b选项打开,则SEEK_END measures the size of the memory buffer。您看到的值必须是默认的缓冲区大小。

答案 1 :(得分:1)

好吧,我已经解决了这个谜团。文档说:

  

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

以后:

  

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

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

仍在寻找适用于标准文件和fmemopen文件的方法。