3

私はmanページを調べ、オンラインでいくつかの例を読みました。他のすべてのシステムと標準の呼び出しは同じデータを回避しているようですが、恐れてみませんか?

#include <stdlib.h>
#include <stdio.h>

unsigned char *data;

int main(int argc, char *argv[])
{
    FILE *fp = fopen("test_out.raw", "rb");
    if (fp == NULL) {
        fprintf(stderr, "ERROR: cannot open test_out.raw.\n");
        return -1;
    }

    long int size;
    fseek(fp, 0L, SEEK_END);
    size = ftell(fp);
    if(size < 0) {
        fprintf(stderr, "ERROR: cannot calculate size of file.\n");
        return -1;
    }

    data = (unsigned char *)calloc(sizeof(unsigned char), size);
    if (data == NULL) {
        fprintf(stderr, "ERROR: cannot create data.\n");
        return -1;
    }

    if (!fread(data, sizeof(unsigned char), size, fp)) {
        fprintf(stderr, "ERROR: could not read data into buffer.\n");
        return -1;
    }

    int i;
    for (i = 0 ; i < size; ++i) {
        if (i && (i%10) == 0) putchar('\n');
        fprintf(stdout, " --%c-- ", (unsigned char)(data[i]));
    }

    free(data);
    fclose(fp);
    return 0;
}
4

2 に答える 2

3

を使用してファイルの最後に移動し、fseekそこから読み取ろうとしていますが、すでにファイルの最後にいるため、読み取るものが残っていないため、読み取りは失敗します。

読み取りを試みる前に、別のファイルの先頭に戻ってくださいfseek

fseek(fp, 0L, SEEK_SET);

または、さらに簡単に、rewind

rewind(fp);
于 2011-12-12T23:13:52.743 に答える
1

ファイルの終わりを見つけるために呼び出しfseekている場合、これにより位置インジケーターがファイルの終わりに移動するため、freadを呼び出すと、読み取るデータが残りません。fseekファイルからデータを読み取ろうとする前に、を使用してファイルの先頭に戻る必要があります。

于 2011-12-12T23:13:05.340 に答える