Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将fread分解为多个变量_C_Linux - Fatal编程技术网

C 将fread分解为多个变量

C 将fread分解为多个变量,c,linux,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

我有以下代码:

// 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);
我想一次完成所有
fread
,可能使用类似于格式字符串的东西(但是
fscanf
仅用于文本文件,对吗?)


非常感谢您的帮助,谢谢

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

#define READ_BUF_SZ 5

unsigned char readbuf[READ_BUF_SZ];
fread(readbuf, READ_BUF_SZ, 1, fp);
然后从缓冲区分配变量

bit_depth = readbuf[0];

等等。

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

unsigned char infos[5];
fread(infos, 1, 5, fp);
unsigned char bit_depth = infos[0];
/* etc. */
或者你可以把它放到一个结构中,但是要注意对齐。为了解决这个问题,您可以在它前面加一个
#pragma pack
指令,但这不太便于携带。由于元素的类型相同,我建议使用数组方法。

*********30个字符 看见
听起来你只是想要一个结构

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以影响其对齐。

将所有变量放入结构中,然后读取结构-毕竟,大多数人都是这样做的use@Petesh同意,但要注意对齐问题……这不是答案。这充其量只是一个暗示。也不鼓励只提供链接的答案。