问题描述
- 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个字节的整型数据啊?
解决方案
问题在于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);
}
一般不出以上两种方式,试一下吧。
当然,也可能设计者比较牛逼一点,在第一种方案的基础上,换用整数的十六进制表达;或者在第二种方案的基础上,规定用“大端”或“小端”编码以让数据文件的格式独立于硬件平台。这就需要揣测者多一番判断和处置了。总之,具体情况具体分析吧:-)
解决方案二:
scanf("%3d",&shuju)
时间: 2024-10-31 23:23:46