查找文件的通过fmemopen创建大小(Finding the size of a file cre

2019-08-02 23:33发布

我使用fmemopen创建一个变量FILE* fid将它传递给函数的读取从打开的文件数据。

某处在功能,它使用下面的代码,找出该文件的大小:

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

这种运作良好,在普通文件的情况下,但通过创建文件ID的情况下, fmemopen我总是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

Answer 1:

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



Answer 2:

好吧,我有这个谜由我自己解决。 该文件说:

如果指定的OpenType附加模式,则初始文件位置被设置为第一个空字符在缓冲区

然后:

对于开放阅读流,缓冲空字符(零个字节)不计为“文件结束”。 读操作指示文件结束,只有当文件位置前进经过大小字节。

看来, fseek(fid, 0, SEEK_END)进入第一个零字节的缓冲区,而不是缓冲区的结束。

还在寻找,将在标准和fmemopen文件的工作方法。



文章来源: Finding the size of a file created by fmemopen
标签: c linux stdio