3

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

编辑2:

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

#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

4

2 回答 2

2

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

于 2012-11-20T11:30:59.903 回答
1

好的,我自己解决了这个谜。文档说:

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

然后:

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

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

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

于 2012-11-20T12:05:43.563 回答