C语言怎么读取3个字节的整型数据

 编写一程序P319.C实现以下功能
  有一存储很多商品数据的二进制文件sp36.dat,每件商品的属性先后包括:品名(17字节的字符串)、规格(12字节的字符串)、数量(3字节的整数)、单价(float实数)。从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录或没有),若有则在屏幕上显示出相应的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔),若无则显示没有相应品名的商品。
  单击此处下载程序运行时测试用的商品数据文件sp36.dat并保存到程序P319.C所在的文件夹且文件名保持不变。编程可用素材:printf("Please input shang pin pin ming:")...、printf("\ncha zhao qing kuang:\n")...、printf("mei you shang pin :...。
  ▲ 提示:使用fread,sizeof(结构体)的方法肯定不对,应单项属性逐个fread!
  程序的运行效果应类似地如图1和图2所示,图1中的Please input shang pin pin ming:xuebi中的xuebi和图2中的Please input shang pin pin ming:kele中的kele是从键盘输入的内容。

这里怎么读取3个字节的整型数据啊?

scanf("%3d",&shuju)

问题在于sp36.dat文件的规格不清楚,还不到提解决方案的时候。
硬要提解决方案的话,首先必须揣测一下sp36.dat文件的规格。

问:sp36.dat文件中,怎么存储“数量”这个“整数”的?

也就是说,要揣测一下,写文件时用的什么方法。

(1)如果是转化为字符串后写入文件的,即用的“格式化输出”办法:

{
    int shuliang = 17;
    fprintf(fp, "%03d", shuliang);
}

则分配一个至少4个字节的字符数组,依次读取三个字符,后面写个0构成标准的csz,然后atoi()即可:

{
    char szShuliang[4];
    fread(szShuliang, 1, 4, fp);
    szShuliang[3] = 0;
    int shuliang = atof(szShuliang);
}

(2)如果写文件时用的以下方式:

{
    int shuliang = 17;
    fwrite(&shuliang, 1, 3, fp);
}

则可以按以下方式读取:

{
    int shuliang;
    fread(&shuliang, 1, 3, fp);
}

一般不出以上两种方式,试一下吧。


当然,也可能设计者比较牛逼一点,在第一种方案的基础上,换用整数的十六进制表达;或者在第二种方案的基础上,规定用“大端”或“小端”编码以让数据文件的格式独立于硬件平台。这就需要揣测者多一番判断和处置了。总之,具体情况具体分析吧:-)