商品记录维护
练习目的:随机存取文件的建立、读取、记录删除和更新操作。
问题描述:有一家商店,为了查看店里有些什么商品、数量有多少以及每件商品的价格如何,需要编制一份商品目录。每种商品都包括4种属性:商品ID、商品名、数量与价格。商品ID为0—99之间的整数,每种商品的ID号互不相同,所以这里默认只有100种商品;商品名只包含大小写字母与空格,长度不超过35个字符;商品数量的范围是0—99999;商品的价格为一个非负的浮点数。
你要帮助商店设计一个二进制文件,存储该商店的所有商品情况。下表为该商店商品清单的样例。
|
记录号(商品ID) |
商品名 |
数量 |
价格 |
|
5 |
Lamp |
23 |
5.99 |
|
8 |
Screwdriver |
9 |
7.99 |
|
10 |
Hammer |
10 |
12.00 |
|
13 |
Bicycle |
5 |
100.99 |
|
16 |
Optical mouse |
21 |
11.50 |
|
25 |
keyboard |
32 |
59.99 |
要求:
1.设计一个结构,来表示一件商品。
2.创建名为“commodity.dat”的二进制文件,存储该商店商品信息,初始化为100条空记录,用商品ID作为记录号。
3.实现对“commodity.dat”中商品信息的初始化录入。
4.根据商品记录号,实现对“commodity.dat”中商品信息的更新,其中记录号不可以更新,其他三项信息均可更新。
5.根据商品记录号,实现对“commodity.dat”中商品信息的删除。
6.实现对“commodity.dat”中全部商品信息的输出。
7.上述2~6项中对文件的初始化、单条商品记录的删除和更新、文件信息的输出这些功能,都分别定义成单独的函数。
1 #include <stdio.h> 2 #include<stdlib.h> 3 /** 4 @author tz 5 @date 2019-04-11 6 */ 7 typedef struct commodity { 8 int id; 9 char name[40]; 10 int number; 11 float price; 12 int key; 13 } THING; 14 void creatFile();//对文件初始化 15 void entryFile();//录入信息 16 void updateFile();//更新信息 17 void deleteFile();//删除信息 18 void printFile();//输出信息 19 20 int main() { 21 int key=8; 22 while (key != 6) { 23 printf("请输入您的选择:\n"); 24 printf("1--创建一个100条空记录的文件\n"); 25 printf("2--输入商品记录\n"); 26 printf("3--更新商品记录\n"); 27 printf("4--删除商品记录\n"); 28 printf("5--输出全部商品记录\n"); 29 printf("6--退出程序\n"); 30 printf("[选择]"); 31 scanf("%d", &key); 32 switch (key) { 33 case(1): 34 creatFile(); 35 break; 36 case(2): 37 entryFile(); 38 break; 39 case(3): 40 updateFile(); 41 break; 42 case(4): 43 deleteFile(); 44 break; 45 case(5): 46 printFile(); 47 printf("\n"); 48 break; 49 case(6): 50 printf("程序运行结束,再见!\n\n"); 51 break; 52 } 53 } 54 return 0; 55 } 56 57 //对文件初始化 58 void creatFile() { 59 THING record[100]; 60 int i; 61 FILE* fptr = fopen("commodity.dat", "wb"); 62 if (fptr == NULL) 63 exit(0); 64 for ( i = 0; i < 100; i++) { 65 record[i].id = i; 66 *(record[i].name) = ""; 67 record[i].price = 0.0; 68 record[i].number = 0; 69 record[i].key = 0; 70 } 71 fwrite(record, sizeof(THING), 100, fptr); 72 printf("100条空记录创建完毕\n\n"); 73 fclose(fptr); 74 } 75 //录入信息(循环) 76 void entryFile() { 77 THING client; 78 FILE* fptr = fopen("commodity.dat", "rb+"); 79 if (fptr == NULL) 80 exit(0); 81 printf("请输入商品信息[ID为-1代表输入结束]:\n"); 82 printf("商品ID:"); 83 scanf("%d", &client.id); 84 getchar(); 85 while (client.id != -1) { 86 printf("商品名:"); 87 gets(client.name); 88 printf("数量:"); 89 scanf("%d", &client.number); 90 printf("价格:"); 91 scanf("%f", &client.price); 92 client.key = 1; 93 fseek(fptr, (client.id) * sizeof(THING), SEEK_SET); 94 fwrite(&client, sizeof(THING), 1, fptr); 95 printf("请输入商品信息[ID为-1代表输入结束]:\n"); 96 printf("商品ID:"); 97 scanf("%d", &client.id); 98 getchar(); 99 } 100 printf("商品信息输入结束\n"); 101 fclose(fptr); 102 printFile(); 103 printf("\n"); 104 } 105 106 //更新信息 107 void updateFile() { 108 FILE* fptr ; 109 while (1) { 110 THING client = {0,"",0,0,0}; 111 char lin[36] = "\0"; 112 int num = 0; 113 float price = 0.0; 114 fptr = fopen("commodity.dat", "rb+"); 115 if (fptr == NULL) 116 exit(0); 117 printf("请输入待更新商品ID[ID为-1代表结束更新]:\n"); 118 scanf("%d", &client.id); 119 if (client.id == -1) 120 break; 121 //读出信息 122 fseek(fptr, (client.id) * sizeof(THING), SEEK_SET); 123 fread(&client, sizeof(THING), 1, fptr); 124 fclose(fptr); 125 if (client.key == 0)//判断此id对应的结构体是否被录入信息 126 { 127 printf("对不起,记录号为%d的商品不存在,无法更新\n", client.id); 128 continue; 129 } 130 //输出原信息 131 printf("原商品信息如下:\n"); 132 printf("记录号(商品ID) 商品名 数量 价格\n"); 133 printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price); 134 printf("请输入更新信息[如某项不更新请直接按回车键]:\n"); 135 //更改 136 getchar(); 137 printf("商品名:"); 138 gets(lin); 139 if (lin[0] != '\0') 140 strcpy(client.name, lin); 141 142 printf("数量:"); 143 gets(lin); 144 int i = 0, len = 1; 145 while (lin[i] != '\0') { 146 num = num * 10 + (lin[i] - '0'); 147 len *= 10; 148 i++; 149 } 150 if(lin[0]!=0) 151 client.number = num; 152 153 printf("价格:"); 154 gets(lin); 155 num = 0; 156 i = 0; 157 len = 1; 158 while (lin[i] != '\0') { 159 if (lin[i] != '.') 160 { 161 num = num * 10 + (lin[i] - '0'); 162 len *= 10; 163 } 164 i++; 165 } 166 if(lin[0]!=0) 167 client.price = num * 1.0 / 100; 168 169 //输出更新后信息 170 printf("更新后商品信息如下:\n"); 171 printf("记录号(商品ID) 商品名 数量 价格\n"); 172 printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price); 173 174 fptr = fopen("commodity.dat", "rb+"); 175 if (fptr == NULL) 176 exit(0); 177 fseek(fptr, (client.id) * sizeof(THING), SEEK_SET); 178 fwrite(&client, sizeof(THING), 1, fptr); 179 fclose(fptr); 180 } 181 182 printf("更新工作结束\n\n"); 183 } 184 185 //删除信息 186 void deleteFile() { 187 FILE* fptr; 188 char lin; 189 while (1) { 190 THING client = { 0,"",0,0,0 }; 191 THING emptydity = { 0,"",0,0,0 }; 192 fptr = fopen("commodity.dat", "rb+"); 193 if (fptr == NULL) 194 exit(0); 195 printf("请输入待删除商品ID[ID为-1代表结束删除]:\n"); 196 scanf("%d", &client.id); 197 getchar(); 198 if (client.id == -1) 199 break; 200 emptydity.id = client.id; 201 fseek(fptr, (client.id) * sizeof(THING), SEEK_SET); 202 fread(&client, sizeof(THING), 1, fptr); 203 fclose(fptr); 204 if (client.key == 0)//判断此id对应的结构体是否被录入信息 205 { 206 printf("对不起,记录号为%d的商品不存在,无法进行删除操作\n", client.id); 207 continue; 208 } 209 210 //输出原信息 211 printf("该商品信息如下:\n"); 212 printf("记录号(商品ID) 商品名 数量 价格\n"); 213 printf("%-25d%-40s%-15d%.2f\n", client.id, client.name, client.number, client.price); 214 215 printf("是否确实删除(确认按Y,取消按N)?\n"); 216 lin=getchar(); 217 if (lin == 'N') 218 { 219 printf("您选择不删除记录号为%d的商品\n", client.id); 220 } 221 else 222 {//用空链表代替原本的 223 fptr = fopen("commodity.dat", "rb+"); 224 if (fptr == NULL) 225 exit(0); 226 fseek(fptr, (client.id) * sizeof(THING), SEEK_SET); 227 fwrite(&emptydity, sizeof(THING), 1, fptr); 228 fclose(fptr); 229 printf("记录号为%d的商品成功删除\n", client.id); 230 } 231 printFile(); 232 } 233 printf("删除工作结束\n\n"); 234 } 235 236 //输出信息 237 void printFile() { 238 FILE*fptr = fopen("commodity.dat", "rb+"); 239 if (fptr == NULL) 240 exit(0); 241 THING comdity[10]; 242 fread(comdity, sizeof(THING), 10, fptr); 243 printf("商品信息如下:\n"); 244 printf("记录号(商品ID) 商品名 数量 价格\n"); 245 //每次读出10个,依次遍历完文件 246 int i,j; 247 for ( j = 10; j <= 100; j+=10) { 248 for ( i = 0; i < 10; i++) 249 { 250 if (comdity[i].key == 1) 251 printf("%-25d%-40s%-15d%.2f\n", comdity[i].id, comdity[i].name, comdity[i].number, comdity[i].price); 252 253 } 254 fseek(fptr, (j) * sizeof(THING), SEEK_SET); 255 fread(comdity, sizeof(THING), 10, fptr); 256 } 257 fclose(fptr); 258 }
程序运行效果:
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]1↙
100条空记录创建完毕
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]2↙
请输入商品信息[ID为-1代表输入结束]:
商品ID:5↙
商品名:Lamp↙
数量:23↙
价格:5.99↙
请输入商品信息[ID为-1代表输入结束]:
商品ID: 8↙
商品名:Screwdriver↙
数量:9↙
价格:7.99↙
请输入商品信息[ID为-1代表输入结束]:
商品ID: 10↙
商品名:Hammer↙
数量:10↙
价格:12.00↙
请输入商品信息[ID为-1代表输入结束]:
-1↙
商品信息输入结束
商品信息如下:
记录号(商品ID) 商品名 数量 价格
5 Lamp 23 5.99
8 Screwdriver 9 7.99
10 Hammer 10 12.00
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]3↙
请输入待更新商品ID[ID为-1代表结束更新]:
8↙
原商品信息如下:
记录号(商品ID) 商品名 数量 价格
8 Screwdriver 9 7.99
请输入更新信息[如某项不更新请直接按回车键]:
商品名:↙
数量:7↙
价格:9.99↙
更新后商品信息如下:
记录号(商品ID) 商品名 数量 价格
8 Screwdriver 7 9.99
请输入待更新商品ID[ID为-1代表结束更新]:
15↙
对不起,记录号为15的商品不存在,无法更新
请输入待更新商品ID[记录号为-1代表结束更新]:
-1↙
更新工作结束
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]4↙
请输入待删除商品ID[记录号为-1代表结束删除]:
8↙
该商品信息如下:
记录号(商品ID) 商品名 数量 价格
8 Screwdriver 7 9.99
是否确实删除(确认按Y,取消按N)?
Y↙
记录号为8的商品成功删除
商品信息如下:
记录号(商品ID) 商品名 数量 价格
5 Lamp 23 5.99
10 Hammer 10 12.00
请输入待删除商品ID[记录号为-1代表结束删除]:
10↙
该商品信息如下:
记录号(商品ID) 商品名 数量 价格
10 Hammer 10 12.00
是否确实删除(确认按Y,取消按N)?
N↙
您选择不删除记录号为10的商品
商品信息如下:
记录号(商品ID) 商品名 数量 价格
5 Lamp 23 5.99
10 Hammer 10 12.00
请输入待删除商品ID[记录号为-1代表结束删除]:
8↙
对不起,记录号为8的商品不存在,无法进行删除操作
请输入待删除商品ID[记录号为-1代表结束删除]:
-1↙
删除工作结束
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]5↙
商品信息如下:
记录号(商品ID) 商品名 数量 价格
5 Lamp 23 5.99
10 Hammer 10 12.00
请输入您的选择:
1--创建一个100条空记录的文件
2--输入商品记录
3--更新商品记录
4--删除商品记录
5--输出全部商品记录
6--退出程序
[选择]6↙
程序运行结束,再见!

浙公网安备 33010602011771号