0

我有以下代码:

// fp is a FILE opened in binary mode
unsigned char bit_depth;
unsigned char color_type;
unsigned char compression_method;
unsigned char filter_method;
unsigned char interlace_method;

fread(&bit_depth, 1, 1, fp);
fread(&color_type, 1, 1, fp);
fread(&compression_method, 1, 1, fp);
fread(&filter_method, 1, 1, fp);
fread(&interlace_method, 1, 1, fp);

我想freads一口气完成,也许使用类似于格式字符串的东西(但fscanf仅适用于文本文件,对吧?)。

非常感谢任何帮助,谢谢!

4

4 回答 4

4

听起来你只想要一个结构。

typedef struct info {
    unsigned char bit_depth;
    unsigned char color_type;
    unsigned char compression_method;
    unsigned char filter_method;
    unsigned char interlace_method;
} info_t;

info_t my_info;
fread(&my_info, sizeof(info_t), 1, fp);

但是,请注意结构填充。如果文件只写了 5 个字节,您需要检查调试器并确保这不会弄乱您的文件指针。通常,结构与 8 字节边界对齐,因此请查看 sizeof(info_t) 的计算结果,如有必要,在结构周围放置一个 pragma 以影响其对齐。

于 2013-06-10T14:43:59.550 回答
3

创建一个包含 5 个元素的数组并将其读入数组,如下所示:

unsigned char infos[5];
fread(infos, 1, 5, fp);
unsigned char bit_depth = infos[0];
/* etc. */

或者您可以将其放入结构中,但要注意对齐。为了解决这个问题,你可以在它前面加上一个#pragma pack指令,但这不太便携。由于元素属于同一类型,我推荐使用数组方法。

于 2013-06-10T14:42:37.440 回答
1

将数据读入足够大小的缓冲区-:

#define READ_BUF_SZ 5

unsigned char readbuf[READ_BUF_SZ];
fread(readbuf, READ_BUF_SZ, 1, fp);

然后从缓冲区分配变量

bit_depth = readbuf[0];

等等

于 2013-06-10T14:42:30.737 回答
-1

** * ** *需要 30 个字符* ** * ** *
http://www.cplusplus.com/reference/cstdio/fread

于 2013-06-10T14:43:08.563 回答