11章:文件处理

11.3 顺序存取文件的创建

/*程序名:fig11_03.c*/
/*
     创建一个顺序文件
*/

#include <stdio.h> //标准输入输出头文件

/*程序开始*/
int main(void)
{
     int account;//账号
     char name[30];//账号名
     double balance;//账号余额
     char ch = 0;

     FILE *cfPtr;//clients文件指针

     /*fopen打开文件。如果不能打开文件则退出程序*/
     if ((cfPtr = fopen("clients.dat","w")) == NULL)
     {
          printf("打开文件失败\n");
     } 
     else
     {
          printf("输入账号,账号名和余额:\n");
          printf("输入EOF结束输入。\n");
          printf("? ");
          scanf("%d%s%lf",&account,name,&balance);
         // ch = getchar();//测试

          /*用fprintf将账号、账号名和余额写入文件*/
          while (!feof(stdin))
          {
               fprintf(cfPtr,"%d %s %.2f\n",account,name,balance);
               printf("? ");
               scanf("%d %s %lf",&account,name,&balance);
             //  ch = getchar();//测试
          }
     }
     fclose(cfPtr);//关闭文件

     return 0;//程序结束
}//main函数结束

11.4 顺序存取文件中读取数据

/*程序名:fig11_07.c*/
/*
     读取和输出顺序文件
*/

#include <stdio.h> //标准输入输出头文件

/*程序开始*/
int main(void)
{
     int account;//账号
     char name[30];//账号名
     double balance;//账号余额

     FILE *cfPtr;//clients文件指针

     /*fopen打开文件。如果不能打开文件则退出程序*/
     if ((cfPtr = fopen("clients.dat","r")) == NULL)//只读模式
     {
          printf("打开文件失败\n");
     } 
     else
     {
          printf("%-10s%-13s%s\n","Accont","Name","Balance");
          fscanf(cfPtr,"%d%s%lf",&account,name,&balance);
 
          /*用fprintf将账号、账号名和余额写入文件*/
          while (!feof(cfPtr))//文件结尾
          {
               printf("%-10d%-13s%f\n", account, name, balance);
               fscanf(cfPtr, "%d%s%lf", &account, name, &balance);
          }
     }
     fclose(cfPtr);//关闭文件

     return 0;//程序结束
}//main函数结束

11.5信用查询程序

/*程序名:fig11_08.c*/
/*
     信贷查询程序
*/

#include <stdio.h> //标准输入输出头文件

/*程序开始*/
int main(void)
{
     int request;//请求账号
     int account;//账号
     char name[30];//账号名
     double balance;//账号余额
     FILE *cfPtr;//clients文件指针

     /*fopen打开文件。如果不能打开文件则退出程序*/
     if ((cfPtr = fopen("clients.dat","r")) == NULL)//只读模式
     {
          printf("打开文件失败\n");
     } 
     else
     {
          /*显示查询选项*/
          printf("请输入查询选项:\n"
               "1-余额为0列表\n"
               "2-贷方余额列表\n"
               "3-借方余额列表\n"
               "4-结束\n");
          printf("\n? ");
          scanf("%d",&request);
 
          /*处理用户请求*/
          while (request != 4)
          {
               /*从文件中读取账号、账号名和余额*/
               fscanf(cfPtr, "%d%s%lf", &account, name, &balance);
               switch (request)
               {
               case 1:
                    printf("\n账户余额为0列表:\n");
                    /*读取文件内容,直到结尾*/
                    while (!feof(cfPtr))
                    {
                         if (balance == 0)
                              printf("%-10d%-13s%7.2f\n",
                              account,name,balance);
                         /*从文件中读取账号、账号名和余额*/
                         fscanf(cfPtr, "%d%s%lf", &account, name, &balance);
                    }
                    break;
               case 2:
                    printf("\n贷方账户余额列表:\n");
                    /*读取文件内容,直到结尾*/
                    while (!feof(cfPtr))
                    {
                         if (balance < 0)
                              printf("%-10d%-13s%7.2f\n",
                                   account, name, balance);
                         /*从文件中读取账号、账号名和余额*/
                         fscanf(cfPtr, "%d%s%lf", &account, name, &balance);
                    }
                    break;
               case 3:
                    printf("\n借方账户余额列表:\n");
                    /*读取文件内容,直到结尾*/
                    while (!feof(cfPtr))
                    {
                         if (balance > 0)
                              printf("%-10d%-13s%7.2f\n",
                                   account, name, balance);
                         /*从文件中读取账号、账号名和余额*/
                         fscanf(cfPtr, "%d%s%lf", &account, name, &balance);
                    }
                    break;
               }//结束switch
               rewind(cfPtr);//将crPtr指针返回到文件开头
               printf("\n查询选项:? ");
               scanf("%d", &request);
          }//结束while
          printf("程序结束\n");
          fclose(cfPtr);//关闭文件
     }//结束else

     return 0;//程序结束
}//main函数结束

11.7 随机存取文件的创建

/*程序名:fig11.11.c*/
/*
     创建随机访问的文件
*/

#include <stdio.h> //标准输入输出头文件

/*clientData结构的定义*/
struct clientData {
     int acctNum;//账号
     char lastName[15];//姓
     char firstName[10];//名
     double balance;//余额
};

/*程序开始*/
int main(void)
{
     /*用默认值创建clientData变量*/
     struct clientData blankclient = {0,"","",0.0};

     FILE *cfPtr;
     /*fopen打开文件,如果打不开则退出程序*/
     if ((cfPtr = fopen("credit.dat","wb")) == NULL)
          printf("打开失败!\n"); 
     else
     {
         printf("打开OK!\n");
          /*向文件输出100个空记录*/
          for (int i = 0;i < 100;i++)
          {
               fwrite(&blankclient,sizeof(struct clientData),1,cfPtr);
          }
          fclose(cfPtr);
     }

     return 0;//程序结束
}//main函数结束

11.8 随机向一个随机存取文件中写入数据

/*程序名:fig11.12.c*/
/*
     写入随机访问文件
*/

#include <stdio.h> //标准输入输出头文件

/*clientData结构的定义*/
struct clientData {
     int acctNum;//账号
     char lastName[15];//姓
     char firstName[10];//名
     double balance;//余额
};

/*程序开始*/
int main(void)
{
     /*用默认值创建clientData变量*/
     struct clientData client = {0,"","",0.0};

     FILE *cfPtr;
     /*fopen打开文件,如果打不开则退出程序*/
     if ((cfPtr = fopen("credit.dat","rb+")) == NULL)//读取并更新模式
          printf("打开失败!\n"); 
     else
     {
          /*需要用户指定账号*/
          printf("输入账号(1~100):\n? ");
          scanf("%d",&client.acctNum);

          /*用户输入信息、并复制到文件中*/
          while (client.acctNum != 0)
          {
               /*用户输入姓,名和余额*/
               printf("输入姓,名,余额\n");

               /*设置记录的姓,名和余额*/
               fscanf(stdin,"%s%s%lf",client.lastName,
                    client.firstName,&client.balance);

               /*在文件中定位用户指定的记录*/
               fseek(cfPtr,(client.acctNum - 1)*
               sizeof(struct clientData),SEEK_SET);

               /*将用户信息写入文件*/
               fwrite(&client,sizeof(struct clientData),1,cfPtr);
               //fprintf(cfPtr,"%d%s%s%f",client.acctNum,client.firstName,client.lastName,client.balance);

               /*让用户输入下一个账号*/
               printf("输入账号:\n? ");
               scanf("%d", &client.acctNum);
          }//结束while
          fclose(cfPtr);
     }//结束else

     return 0;//程序结束
}//main函数结束

11.9 从随机存取文件中读取数据

/*程序名:fig11.15.c*/
/*
     读取随机访问文件
*/

#include <stdio.h> //标准输入输出头文件

/*clientData结构的定义*/
struct clientData {
     int acctNum;//账号
     char lastName[15];//姓
     char firstName[10];//名
     double balance;//余额
};

/*程序开始*/
int main(void)
{
     /*用默认值创建clientData变量*/
     struct clientData client = {0,"","",0.0};

     FILE *cfPtr;
     /*fopen打开文件,如果打不开则退出程序*/
     if ((cfPtr = fopen("credit.dat","rb")) == NULL)//读取并更新模式
          printf("打开失败!\n"); 
     else
     {
          printf("%-6s%-16s%-11s%10s\n","账号","姓","名","余额");

          /*从文件中读取全部记录*/
          while (!feof(cfPtr))
          {
               fread(&client,sizeof(struct clientData),1,cfPtr);

               /*显示记录*/
               if(client.acctNum != 0)
                    printf("%-6d%-16s%-11s%10.2f\n",client.acctNum,
                    client.lastName,client.firstName,client.balance);
          }//结束while
          fclose(cfPtr);
     }//结束else

     return 0;//程序结束
}//main函数结束

11.10 案例学习:十五处理程序

/*程序名:fig11.16.c*/
/*
     读取随机访问文件
更新已经写入文件的数据,
创建新的数据并放入文件中,
以及删除文件中已有的数据
*/

#include <stdio.h> //标准输入输出头文件

/*clientData结构的定义*/
struct clientData {
     int acctNum;//账号
     char lastName[15];//姓
     char firstName[10];//名
     double balance;//余额
};

/*函数原型*/
int enterChoice(void);
void textFile(FILE *readPtr);
void updateRecord(FILE *fPtr);
void newRecord(FILE *fPtr);
void deleteRecord(FILE *fPtr);

/*程序开始*/
int main(void)
{
     FILE *cfPtr;
     int choice;//用户选择

     /*fopen打开文件,如果打不开则退出程序*/
     if ((cfPtr = fopen("credit.dat","rb+")) == NULL)//读取并更新模式
          printf("打开失败!\n"); 
     else
     {
          /*选择*/
          while ((choice = enterChoice()) != 5)
          {
               switch (choice)
               {
               case 1:
                    textFile(cfPtr);
                    break;
               case 2:
                    updateRecord(cfPtr);
                    break;
               case 3:
                    newRecord(cfPtr);
                    break;
               case 4:
                    deleteRecord(cfPtr);
                    break;
               default:
                    printf("选择错误\n");
                    break;
               }
          }//结束while
          fclose(cfPtr);
     }//结束else

     return 0;//程序结束
}//main函数结束

/*创建格式化文本文件以备输出*/
void textFile(FILE *readPtr)
{
     FILE *writePtr;//accounts.txt文件指针
     
     /*初始化client结构变量*/
     struct clientData client = {0,"","",0};

     /*创建accounts.txt文件*/
     if ((writePtr =fopen("accounts.txt","w")) == NULL)
          printf("打开文件失败。\n"); 
     else
     {
          /*将文件指针移到文件开头*/
          rewind(readPtr);
          fprintf(writePtr,"%-6s%-16s%-11s%10s\n","账号","姓","名","余额");
          /*随机访问文件记录复制到文本中*/
          while (!feof(readPtr))
          {
               fread(&client,sizeof(struct clientData),1,readPtr);
               if (client.acctNum != 0){
                    fprintf(writePtr,"%-6d%-16s%-11s%10.2f\n",client.acctNum,
                         client.lastName, client.firstName, client.balance);
               }
          }
          fclose(writePtr);
     }
}
/*更新记录中的余额*/
void updateRecord(FILE *fPtr)
{
     int account;//账号
     double transaction;//交易额

     /*初始化client结构变量*/
     struct clientData client = { 0,"","",0 };

     /*获得需要更新的账号*/
     printf("请输入账号(1~100):");
     scanf("%d",&account);

     /*将文件指针移到到正确的位置*/
     fseek(fPtr,(account-1)*sizeof(struct clientData),SEEK_SET);

     /*从文件中读取记录*/
     fread(&client,sizeof(struct clientData),1,fPtr);

     if (client.acctNum == 0)
     {
          printf("%d账号不存在。\n",account);
     } 
     else
     {
          printf("%-6d%-16s%-11s%10.2f\n", client.acctNum,
               client.lastName, client.firstName, client.balance);
          /*用户输入交易额*/
          printf("请输入存取金额(+存,-取):");
          scanf("%lf",&transaction);
          client.balance += transaction;//更新账户余额

          printf("%-6d%-16s%-11s%10.2f\n", client.acctNum,
               client.lastName, client.firstName, client.balance);

          /*将文件指针移到到正确的位置*/
          fseek(fPtr, (account - 1) * sizeof(struct clientData), SEEK_SET);
          /*写入文件中新的记录*/
          fwrite(&client, sizeof(struct clientData), 1, fPtr);
     }
}
/*删除已有记录*/
void deleteRecord(FILE *fPtr)
{
     struct clientData client;//保存从文件中读取的记录
     struct clientData blankClient = { 0,"","",0 };//空记录
     int accountNum;//账号

     /*获得要删除的记录*/
     printf("请输入要删除的账号(1~100):");
     scanf("%d", &accountNum);
     /*将文件指针移到到正确的位置*/
     fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
     /*从文件中读取记录*/
     fread(&client, sizeof(struct clientData), 1, fPtr);

     if (client.acctNum == 0)
     {
          printf("%d账号不存在。\n", accountNum);
     }
     else
     {
          /*将文件指针移到到正确的位置*/
          fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
          /*写入文件中新的记录*/
          fwrite(&blankClient, sizeof(struct clientData), 1, fPtr);
     }
}
/*创建并插入记录*/
void newRecord(FILE *fPtr)
{
     /*初始化client结构变量*/
     struct clientData client = { 0,"","",0 };
     int accountNum;//账号

     /*获得要创建的账号*/
     printf("请输入要删除的账号(1~100):");
     scanf("%d", &accountNum);

     /*将文件指针移到到正确的位置*/
     fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);

     /*从文件中读取记录*/
     fread(&client, sizeof(struct clientData), 1, fPtr);

     if (client.acctNum != 0)
     {
          printf("%d账号存在,创建失败。\n", accountNum);
     }
     else
     {
          /*用户输入姓,名和余额*/
          printf("输入姓,名和余额\n");
          scanf("%s%s%lf",&client.lastName,&client.firstName,&client.balance);
          client.acctNum = accountNum;

          /*将文件指针移到到正确的位置*/
          fseek(fPtr, (accountNum - 1) * sizeof(struct clientData), SEEK_SET);
          /*写入文件中新的记录*/
          fwrite(&client, sizeof(struct clientData), 1, fPtr);
     }
}
/*输入菜单选项*/
int enterChoice(void)
{
     int menuChiose;
     printf("\n输入选项:\n"
          "1-将记录保存至新创建的文本中\n"
          "2-更新记录\n"
          "3-创建记录\n"
          "4-删除记录\n"
          "5-结束程序\n"
          );
     scanf("%d",&menuChiose);
     return menuChiose;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值