0

バイナリファイルからデータを読み取るコードを扱っています。コードはここにあります。ここでfseekとfreadの役割を教えてください。

fc = fopen(CLOUDS_FILE, "rb");
if (fc == NULL){ fputs("File open error.\n", stderr); exit(1); }
crs = aux[CLRS];
fpos = (int) (pixel[2]*crs*crs + pixel[1]*crs + pixel[0]);
flsz = sizeof(fd);
fseek(fc, fpos*flsz, 0);
rd = fread((void *) &fd, flsz, 1, fc);
if (rd != 1){ fputs("Read error.\n", stderr); exit(1); }
fclose(fc);
4

4 に答える 4

1

fseek() は、ファイルのオフセットを変更します。fread() は、現在のオフセットから始まるデータを読み取り、読み取った要素の数だけオフセットをインクリメントします。

(または、質問はまったく別のものですか?つまり、上記はマンページを読むことで簡単に理解できるものです)

于 2012-02-29T11:07:37.867 に答える
1

バイナリ ファイルの読み取りは、テキスト エディタが何かを編集するときにカーソル位置を持つように、内部の「ポインタ」を使用して行われます。ファイルを読み取りモードで ( を使用してfopen) 開くと、ポインターはファイルの先頭になります。読み取り操作 (freadストリームから指定されたバイト数を読み取る など) は、ポインターの位置から読み取りを開始し、通常、読み取りが完了するとポインターを進めます。ファイルの特定の部分のみを読み取る必要がある場合は、ポインターを特定の (相対または絶対) 位置に手動で設定することができます。これfseekが使用されます。

于 2012-02-29T11:09:55.337 に答える
0
   #include <stdio.h>

   int fseek(FILE *stream, long offset, int whence);

fseek() 関数は、stream が指すストリームのファイル位置標識を設定します。バイト単位で測定される新しい位置は、whence で指定された位置にオフセット バイトを追加することによって取得されます。whence が SEEK_SET、SEEK_CUR、または SEEK_END に設定されている場合、オフセットはそれぞれ、ファイルの先頭、現在の位置インジケータ、またはファイルの末尾に相対的です。

   #include <stdio.h>

   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

関数 fread() は、stream が指すストリームから、各 size バイト長のデータの nmemb 要素を読み取り、それらを ptr で指定された場所に格納します。

于 2012-02-29T11:06:57.860 に答える
0

確かに、fseekはファイル内の「読み取り元」インデックスをCLOUDS_FILEの計算されたオフセットに転送していますが、freadはサイズsizeof(fd)の1つのオブジェクトを読み取ります(貼り付けたコードにないため、fdが何であれ)。

于 2012-02-29T11:07:18.743 に答える