3

開いているファイルからデータを読み取る関数に渡す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を取得します

4

2 に答える 2

2

の場合、オプションをfmemopen使用して開くと、SEEK_ENDはメモリバッファのサイズを測定します。表示される値は、デフォルトのバッファサイズである必要があります。b

于 2012-11-20T11:30:59.903 に答える
1

OK、私はこの謎を自分で解決しました。ドキュメントには次のように書かれています。

opentypeが追加モードを指定している場合、ファイルの初期位置はバッファー内の最初のヌル文字に設定されます

以降:

読み取り用に開いているストリームの場合、バッファー内のヌル文字(ゼロバイト)は「ファイルの終わり」としてカウントされません。読み取り操作は、ファイル位置がサイズバイトを超えて進んだ場合にのみファイルの終わりを示します。

これはfseek(fid, 0, SEEK_END)、バッファの最後ではなく、バッファの最初のゼロバイトに送られるようです。

標準ファイルとfmemopenファイルの両方で機能する方法をまだ探しています。

于 2012-11-20T12:05:43.563 に答える