找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
楼主: 不高兴

C语言学习实战项目(商品管理系统)

[复制链接]

2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-1 10:29:22 | 显示全部楼层
函数名
fwrite
功能
C语言函数,向文件写入一个数据块
用法
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
注意:这个函数以二进制形式对文件进行操作,不局限于文本文件
返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要输出数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。
说明:写入到文件的哪里? 这个与文件的打开模式有关,如果是w+,则是从file pointer指向的地址开始写,替换掉之后的内容,文件的长度可以不变,stream的位置移动count个数;如果是a+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite[1]函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。

2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-1 10:35:28 | 显示全部楼层
  1. /*录入商品信息*/
  2. void in()
  3. {
  4.     int i,m = 0;                                /*m是记录的条数*/
  5.     char ch[2];
  6.     FILE *fp;                                    /*定义文件指针*/
  7.     if ((fp = fopen("data","ab+")) == NULL)        /*打开指定文件*/
  8.     {
  9.         printf("不能打开文件!\n");
  10.         return;
  11.     }
  12.     while (!feof(fp))
  13.     {
  14.         if (fread(&comm[m], LEN, 1, fp) == 1)    /*统计当前记录条数*/
  15.         {
  16.             m++;
  17.         }
  18.     }
  19.     fclose(fp);
  20.     if (m == 0)
  21.     {
  22.         printf("没有找到!\n");
  23.     }
  24.     else
  25.     {
  26.         system("cls");
  27.         show();                                    /*调用show函数,显示原有信息*/
  28.     }
  29.     if ((fp = fopen("data","wb")) == NULL)
  30.     {
  31.         printf("不能打开文件!\n");
  32.         return;
  33.     }
  34.     for (i = 0; i < m; i++)
  35.     {
  36.         fwrite(&comm[i], LEN, 1, fp);            /*向指定的磁盘文件写入信息*/
  37.     }
  38.     printf("是否输入?(y/n):");
  39.     scanf("%s", ch);
  40.     while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)    /*判断是否要录入新信息*/
  41.     {
  42.         printf("编号:");
  43.         scanf("%d", &comm[m].num);                /*输入商品编号*/
  44.         for (i = 0; i < m; i++)
  45.         {
  46.             if (comm[i].num == comm[m].num)
  47.             {
  48.                 printf("该记录已经存在,按任意键继续!");
  49.                 getch();
  50.                 fclose(fp);
  51.                 return;
  52.             }
  53.         }
  54.         printf("商品名:");
  55.         scanf("%s",comm[m].name);                /*输入商品名*/
  56.         printf("单价:");
  57.         scanf("%lf",&comm[m].price);            /*输入商品单价*/
  58.         printf("数量:");
  59.         scanf("%lf",&comm[m].count);            /*输入商品数量*/
  60.         comm[m].total = comm[m].price * comm[m].count;        /*计算出总金额*/
  61.         if (fwrite(&comm[m],LEN,1,fp) != 1)        /*将新录入的信息写入指定的磁盘文件*/
  62.         {
  63.             printf("不能保存!");
  64.             getch();
  65.         }
  66.         else
  67.         {
  68.             printf("%s 已经保存!\n", comm[m].name);
  69.             m++;
  70.         }
  71.         printf("是否继续?(y/n):");            /*询问是否继续*/
  72.         scanf("%s", ch);
  73.     }
  74.     fclose(fp);
  75.     printf("OK!\n");
  76. }
复制代码
*前面忘记声明一个comm结构体代码如下
  1. struct commdity comm[50];
复制代码
[attachment=822]




2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-3 09:43:09 | 显示全部楼层
[attachment=824]
  1. /*自定义查找函数*/
  2. void search()
  3. {
  4.     FILE *fp;
  5.     int snum, i, m = 0;
  6.     char ch[2];
  7.     if ((fp = fopen("data", "ab+")) == NULL)
  8.     {
  9.         printf("不能打开文件\n");
  10.         return;
  11.     }
  12.     while (!feof(fp))
  13.     {
  14.         if (fread(&comm[m], LEN, 1, fp) == 1)
  15.         {
  16.             m++;
  17.         }
  18.     }
  19.     fclose(fp);
  20.     if(m == 0)
  21.     {
  22.         printf("没有记录!\n");
  23.         return;
  24.     }
  25.     printf("请输入编号:");
  26.     scanf("%d", &snum);
  27.     for (i = 0; i < m; i++)
  28.     {
  29.         if (snum == comm[i].num)            /*查找输入的编号是否在记录中*/
  30.         {
  31.             printf("已经找到了该记录,是否显示?(y/n)");
  32.             scanf("%s", ch);
  33.             if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)
  34.             {
  35.                 printf("编号    商品名称       单价        数量        总金额 \t\n");
  36.                 printf(FORMAT, DATA);        /*将查找出的结果按指定格式输出*/
  37.                 break;
  38.             }
  39.             else
  40.             {
  41.                 return;
  42.             }
  43.         }
  44.     }
  45.     if (i == m)
  46.     {
  47.         printf("没有找到相应的记录!\n");    /*未找到要查找的信息*/
  48.     }
  49. }
复制代码

2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-3 10:14:24 | 显示全部楼层
[attachment=827]
  1. /*自定义删除函数*/
  2. void del()
  3. {
  4.     FILE *fp;
  5.     int snum, i, j, m = 0;
  6.     char ch[2];
  7.     if ((fp = fopen("data", "ab+")) == NULL)
  8.     {
  9.         printf("不能打开文件\n");
  10.         return;
  11.     }
  12.     while(!feof(fp))
  13.         if(fread(&comm[m], LEN, 1, fp) == 1)
  14.             m++;
  15.     fclose(fp);
  16.     if (m == 0)
  17.     {
  18.         printf("没有记录!\n");
  19.         return;
  20.     }
  21.     printf("请输入编号:");
  22.     scanf("%d", &snum);
  23.     for(i = 0; i < m; i++)
  24.         if(snum == comm[i].num)
  25.             break;
  26.     if (i == m)
  27.     {
  28.         printf("没有找到!");
  29.         getchar();
  30.         return;
  31.     }
  32.     printf("已经找到该记录,是否删除?(y/n)");
  33.     scanf("%s", ch);
  34.     if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0)        /*判断是否要进行删除*/
  35.     {
  36.         for(j = i; j < m; j++)
  37.             comm[j] = comm[j + 1];                            /*将后一个记录移到前一个记录的位置*/
  38.         m--;                                                /*记录的总个数减1*/
  39.         printf("成功删除!\n");
  40.     }
  41.     if ((fp = fopen("data", "wb")) == NULL)
  42.     {
  43.         printf("不能打开!\n");
  44.         return;
  45.     }
  46.     for(j = 0; j < m; j++)                                    /*将更改后的记录重新写入指定的磁盘文件中*/
  47.         if(fwrite(&comm[j], LEN, 1, fp) != 1)
  48.         {
  49.             printf("不能保存!\n");
  50.             getch();
  51.         }
  52.     fclose(fp);
  53. }
复制代码
[attachment=826][attachment=825]

2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-3 10:55:31 | 显示全部楼层
[attachment=830]

[attachment=831]

[attachment=832]
  1. /*自定义修改函数*/
  2. void modify()
  3. {
  4.     FILE *fp;
  5.     int i, j, m = 0, snum;
  6.     char ch[2];
  7.     if ((fp = fopen("data", "ab+")) == NULL)
  8.     {
  9.         printf("不能打开文件!\n");
  10.         return;
  11.     }
  12.     while(!feof(fp))
  13.         if(fread(&comm[m], LEN, 1, fp) == 1)
  14.             m++;
  15.         if (m == 0)
  16.         {
  17.             printf("没有记录!\n");
  18.             fclose(fp);
  19.             return;
  20.         }
  21.         printf("请输入要修改的记录信息的编号!\n");
  22.         scanf("%d", &snum);
  23.         for(i = 0; i < m; i++)
  24.             if(snum == comm[i].num)                /*检索记录中是否有要修改的信息*/
  25.                 break;
  26.             if (i < m)
  27.             {
  28.                 printf("已经找到该记录,是否修改?(y/n)\n");
  29.                 scanf("%s", ch);
  30.                 if (strcmp(ch, "Y") == 0 || strcmp(ch,"y") == 0)
  31.                 {
  32.                     printf("商品名:");
  33.                     scanf("%s", comm[i].name);
  34.                     printf("单价:");
  35.                     scanf("%lf", &comm[i].price);
  36.                     printf("数量:");
  37.                     scanf("%lf", &comm[i].count);
  38.                     comm[i].total = comm[i].price * comm[i].count;
  39.                     printf("修改成功!");
  40.                 }
  41.                 else
  42.                     return;
  43.                
  44.             }
  45.             else
  46.             {
  47.                 printf("没有找到!");
  48.                 getchar();
  49.                 return;
  50.             }
  51.             if ((fp = fopen("data", "wb")) == NULL)
  52.             {
  53.                 printf("不能打开文件!\n");
  54.                 return;
  55.             }
  56.             for(j = 0; j < m; j++)                /*将新修改的信息写入指定的磁盘文件中*/
  57.                 if(fwrite(&comm[j], LEN, 1, fp) != 1)
  58.                 {
  59.                     printf("不能修改!");
  60.                     getch();
  61.                 }
  62.                 fclose(fp);
  63. }
复制代码

2

主题

17

回帖

0

积分

新手上路

积分
0
 楼主| 发表于 2013-8-3 12:08:01 | 显示全部楼层
  1. /*自定义插入函数*/
  2. void insert()
  3. {
  4.     FILE *fp;
  5.     int i, j, k, m = 0, snum;
  6.     if ((fp = fopen("data", "ab+")) == NULL)
  7.     {
  8.         printf("不能打开文件!\n");
  9.         return;
  10.     }
  11.     while(!feof(fp))
  12.         if(fread(&comm[m], LEN, 1, fp) == 1)
  13.             m++;
  14.         if (m == 0)
  15.         {
  16.             printf("没有记录!\n");
  17.             fclose(fp);
  18.             return;
  19.         }
  20.         printf("请输入要插入记录的位置!\n");
  21.         scanf("%d", &snum);                    /*输入要插入的位置*/
  22.         for(i = 0; i < m; i++)
  23.             if(snum == comm[i].num)
  24.                 break;
  25.             for(j = m - 1; j > i; j--)
  26.                 comm[j + i] = comm[j];        /*从最后一条记录开始均向后移一位*/
  27.             printf("Now please input the new information.\n");
  28.             printf("编号:");
  29.             scanf("%d", &comm[i + 1].num);
  30.             for(k = 0; k < m; k++)
  31.                 if (comm[k].num == comm[i + 1].num && k != i + 1)
  32.                 {
  33.                     printf("该编号已经存在,按任意键继续!");
  34.                     getch();
  35.                     fclose(fp);
  36.                     return;
  37.                 }
  38.                 printf("商品名:");
  39.                 scanf("%s", comm[i + 1].name);
  40.                 printf("单价:");
  41.                 scanf("%lf", &comm[i + 1].price);
  42.                 printf("数量:");
  43.                 scanf("%lf", &comm[i + 1].count);
  44.                 comm[i + 1].total = comm[i + 1].price * comm[i + 1].count;
  45.                 if ((fp = fopen("data", "wb")) == NULL)
  46.                 {
  47.                     printf("不能打开文件!\n");
  48.                     return;
  49.                 }
  50.                 for(k = 0; k <= m; k++)
  51.                     if (fwrite(&comm[k], LEN, 1, fp) != 1)        /*将修改后的记录写入磁盘文件中*/
  52.                     {
  53.                         printf("不能保存!");
  54.                         getch();
  55.                     }
  56.                     fclose(fp);
  57. }
  58. /*统计*/
  59. void total()
  60. {
  61.     FILE *fp;
  62.     int m = 0;
  63.     if ((fp = fopen("data", "ab+")) == NULL)
  64.     {
  65.         printf("不能打开记录!\n");
  66.         return;
  67.     }
  68.     while(!feof(fp))
  69.         if(fread(&comm[m], LEN, 1, fp) == 1)
  70.             m++;                            /*统计记录个数*/
  71.         if (m == 0)
  72.         {
  73.             printf("没有记录!\n");
  74.             fclose(fp);
  75.             return;
  76.         }
  77.         printf("一共有 %d 条记录!\n", m);        /*将统计的记录个数输出*/
  78.         fclose(fp);
  79. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 19:39 , Processed in 0.076309 second(s), 19 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表