闯入多个变量

时间:2013-06-10 14:36:19

标签: c linux

我有以下代码:

// 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 个答案:

答案 0 :(得分: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以影响其对齐。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

#define READ_BUF_SZ 5

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

然后从缓冲区中分配变量

bit_depth = readbuf[0];

答案 3 :(得分:-1)

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