20251期《C语言程序设计B》专项训练05-文件02-程序P314.C

11 阅读2分钟

题目

编写一程序P314.C实现以下功能
有一存储很多商品数据(每件商品的属性先后包括:品名、规格、单价(有小数位)、数量,数据的最长长度分别为20、10、6、5,在文件中以空格为分隔,每个商品的数据占一行)的文本文件,从键盘输入某种商品的品名,要求在文件中查找有无相应品名商品(可能有多条记录或没有),若有则在屏幕上显示出相应的商品的品名、规格、数量、单价(显示时,品名、规格、数量、单价之间使用逗号(,)作分隔,单价显示时只显示2位小数),若无则显示没有相应品名的商品。

被读文件sp.txt的内容如下,模拟待测试的商品数据。自行创建文件,并将该文件置于本程序文件夹下,注意文件名。

xuebi da 6.00 345
nongfuSQxianchengduo zhongxingA 4.392 57398
xuebi xiao 2.004 4567
xuebi da 6.003 456

编程可用素材:printf("Please input shang pin pin ming:")...、printf("\ncha zhao qing kuang:\n")...、printf("mei you shang pin :...。
程序的运行效果应类似地如图1和图2所示,图1中的Please input shang pin pin ming:xuebi中的xuebi和图2中的Please input shang pin pin ming:kele中的kele是从键盘输入的内容。 测试时输入

xuebi

或者

kele

题解

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	// 变量准备
	FILE *fp;
	char name[21];
	char inputName[21];
	char size[11];
	float price;
	int number;
	int flag = 0;
	
	printf("Please input shang pin pin ming:");
	scanf("%s", inputName); // 遇到空格,tab,和回车结束串
	
	// 开文件
	fp = fopen("sp.txt", "r");
	if (NULL == fp)
	{
		printf("file open error.\n");
		exit(1);
	}
	
	// 处理数据
	printf("\ncha zhao qing kuang:\n");
	
	// 一直格式化读取文件到内存变量中,注意检测fscanf的返回值
	while (fscanf(fp, "%s %s %f %d", name, size, &price, &number) == 4)
	{
		// 字符串比较,相同则有,有测立标并输出
		if (strcmp(inputName, name) == 0)
		{
			flag = 1;
			printf("%s,%s,%d,%.2f\n", name, size, number, price);
		}
	}
	// 处理没有的情况
	if (flag == 0)
	{
		printf("mei you shang pin :%s", inputName);
	}
	
	// 关文件
	fclose(fp);
	fp = NULL;
	
	return 0;
}



知识点

  • 文件开闭,打开后的指针非空检测
  • 文件的格式化读取
  • 文件读取的正确性检查
  • 业务处理:字符串的匹配检查,使用库函数判断两个字符串是否相同
  • 计数统计