1

プログラムを実行し、製品リストを表示することを選択すると、何も出力されません。しばらくすると、 の値fl_sizeが常に 0 であることがわかりました。これはなぜですか?

void view_prdct_code_list() {
        FILE *stock = fopen("stock.dat","r+");
        assert(stock);

        int fl_size=ftell(stock);
        int prd_size= sizeof(product);
        int quantity= fl_size/prd_size;
        printf("fl_size=%d",fl_size);

        fseek(stock,0,SEEK_SET);
        prdct cprd= (product *)malloc (sizeof(product)*quantity);
        assert(cprd);

        int i;

        fread(cprd,prd_size,quantity,stock);

        for (i=0;i<quantity;i++){
                printf("PRODUCT CODE: %d\n",cprd->code);
        }

        free(cprd);
        fclose(stock);
}
4

3 に答える 3

8

ftellファイルの合計サイズを返しません。ファイル内の現在の読み取りまたは書き込み位置を返します。ftellファイルを開いた直後に呼び出すため、その位置はファイルの先頭です。を呼び出す前に を使用fseek(stock, 0, SEEK_END)して最後までシークするかftell、レイヤーをドロップダウンして を使用fstat(fileno(stock))して OS からファイル サイズを直接取得することができます。

その他の注意事項:

  1. パイプから読み取る場合、これらのオプションはどちらも機能しません。(一般に、すべてのファイル アクセス操作の成功を確認する必要があります。)
  2. fread要求されたとしても、ファイル全体を一度に読み取ることは保証されていません。
  3. 「alk」が指摘するように、ではなくをftell返します。longint
  4. が 32 ビットのみの場合long、ファイルが非常に大きくなり、そのサイズがlong. プログラムでそれほど大きなファイルを処理する必要がある場合は、すべてのファイル#define _FILE_OFFSET_BITS 64の先頭(すべてのインクルードの前) で and を使用する必要があります。(または、Windows に相当するものは何でも。).cfseekoftello
  5. この明らかにバイナリ ファイルを mode で開く必要があります"r+b"
  6. ファイル ヘッダーのないバイナリ ファイル (特に、オフセット ゼロで少なくとも 4 バイトのマジック ナンバーがない) は、Bad Thing です。
  7. の戻り値をキャストしないでくださいmalloc。(C++ ではこれを行う必要がありますが、C では不要であるだけでなく、バ​​グを隠すことができます。)
于 2014-06-03T16:01:49.587 に答える
2

のマニュアル ページを確認してくださいftellたとえば、次のようになります。

関連する部分は次のとおりです。「 ftell() 関数は、ストリームが指すストリームのファイル位置インジケータの現在の値を取得します。」

ファイルを開くと、カーソル位置が先頭になります。したがって、開始からの距離はゼロになります。したがってftell、ゼロを返します。

ファイルのサイズを確認するには、次のリンクを参照してください: How can I get a file's size in C? . 短いスニペットを次に示します。

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);

上記後必ずお電話くださいfseek(fp, 0L, SEEK_SET);

于 2014-06-03T16:01:21.217 に答える
0

ftellファイルの先頭から現在の位置までのサイズを返すためです。

fseek(stock,0,SEEK_SET);

ファイルの最初のバイトに位置を設定することを意味します。

fl_size=ftell(stock); また、 の後に設定する必要がありfseekます。

于 2014-06-03T15:56:33.677 に答える