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;
}