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 指向的流设置文件位置指示符。新位置(以字节为单位)是通过将偏移字节添加到 wherece 指定的位置来获得的。如果 wherece 设置为 SEEK_SET、SEEK_CUR 或 SEEK_END,则偏移量分别相对于文件开头、当前位置指示符或文件结尾。

   #include <stdio.h>

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

函数 fread() 从 stream 指向的流中读取数据的 nmemb 元素,每个 size 字节长,并将它们存储在 ptr 给定的位置。

于 2012-02-29T11:06:57.860 回答
0

当然,fseek 正在将文件中的“读取自”索引转发到 CLOUDS_FILE 中的计算偏移量,而 fread 正在将一个大小为 sizeof(fd) 的对象(无论 fd 是什么,因为它不在您粘贴的代码中)读取到 fd 中。

于 2012-02-29T11:07:18.743 回答