void loss_card(void)
{
char infor[11];
int a; int size = sizeof(struct arm);
FILE *pcard;
if ((pcard = fopen("book.dat", "a+b")) == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
while (getchar() != '\n')
;
printf("请输入查询卡号:\n");
s_gets(infor, 11);
printf("测试\n");
for (a = 0; fread(&num[a], size, 1, pcard); a++)
{
if (strncmp(infor, num[a].num_car, 10) == 0)
{
if (num[a].state == 0)
{
num[a].state = 1;
printf("%s %s: $%.2f %d\n", num[a].name, num[a].num_car, num[a].value, num[a].state);
}
else
printf("该账户已挂失。");
}
}
fwrite(&num[a], size, 1, pcard);
printf("测试\n");
fclose(pcard);
}
C语言,使用结构体保存的文件,再次打开修改后怎样把新数据保存在原位置(附代码,希望可以帮忙修改)
答案:1 悬赏:40 手机版
解决时间 2021-01-24 14:58
- 提问者网友:喧嚣尘世
- 2021-01-23 21:08
最佳答案
- 五星知识达人网友:忘川信使
- 2021-01-23 22:17
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 0
// thu 1004: $4.50 0
// fri 1005: $5.60 0
// 请输入查询卡号: 1003
// 测试---开始
// wed 1003: $3.40 1
// 测试---结果
//
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 1
// thu 1004: $4.50 0
// fri 1005: $5.60 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct arm
{
char name[11];
char num_car[11];
float value;
int state;
};
struct arm num[100]; //暂时没有用到
void loss_card(void)
{
struct arm oneItem;
char infor[11];
//原代码int a;
int ret; //函数fread()的返回值
int size = sizeof(struct arm);
FILE *pcard;
//原代码if ((pcard = fopen("book.dat", "a+b")) == NULL)
// rb+ 读写打开一个二进制文件,允许读写数据(可以任意修改),文件必须存在.
if ((pcard = fopen("book.dat", "rb+")) == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
//原代码while (getchar() != '\n');
//原代码printf("请输入查询卡号:\n");
//原代码s_gets(infor, 11);
printf("请输入查询卡号:");
fflush(stdin); //清空输入缓存,吸收掉回车符(有的编译器不适用)
gets(infor);
printf("测试---开始\n");
//原代码for (a = 0; fread(&num[a], size, 1, pcard); a++)
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
if (strncmp(infor, oneItem.num_car, 10) == 0)
{
if(oneItem.state == 0)
{
oneItem.state = 1;
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
else
{
printf("该账户已挂失。");
}
//把文件指针移动到离文件当前位置的-size的地方,也就是退回1个size
//常数SEEK_CUR表示当前位置
fseek(pcard,-size,SEEK_CUR);
fwrite(&oneItem, size, 1, pcard); //写入新数据
//只需找到一个,写入新数据后就退出,如果继续循环,会异常
break;
}
}
}
//原代码fwrite(&num[a], size, 1, pcard);
printf("测试---结束\n");
fclose(pcard);
}
void testWrite() //测试:写入文件
{
struct arm test[5]={{"mon","1001",1.2,0},{"tue","1002",2.3,0},
{"wed","1003",3.4,0},{"thu","1004",4.5,0},
{"fri","1005",5.6,0}};
FILE *pcard;
int size = sizeof(struct arm);
int a;
// wb 只写打开或建立一个二进制文件,只允许写数据
pcard = fopen("book.dat", "wb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
for(a=0;a<5;a++)
{
fwrite(&test[a], size, 1, pcard);
}
fclose(pcard);
}
void testRead() //测试:读取文件
{
struct arm oneItem;
FILE *pcard;
int size = sizeof(struct arm);
int ret;
// rb 只读打开一个二进制文件,只允许读数据
pcard = fopen("book.dat", "rb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
printf("\n显示文件的数据:\n");
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
}
fclose(pcard);
}
int main()
{
testWrite(); //测试:写入文件
testRead(); //测试:读取文件
loss_card();
testRead(); //测试:读取文件
return 0;
}
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 0
// thu 1004: $4.50 0
// fri 1005: $5.60 0
// 请输入查询卡号: 1003
// 测试---开始
// wed 1003: $3.40 1
// 测试---结果
//
// 显示文件的数据:
// mon 1001: $1.20 0
// tue 1002: $2.30 0
// wed 1003: $3.40 1
// thu 1004: $4.50 0
// fri 1005: $5.60 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct arm
{
char name[11];
char num_car[11];
float value;
int state;
};
struct arm num[100]; //暂时没有用到
void loss_card(void)
{
struct arm oneItem;
char infor[11];
//原代码int a;
int ret; //函数fread()的返回值
int size = sizeof(struct arm);
FILE *pcard;
//原代码if ((pcard = fopen("book.dat", "a+b")) == NULL)
// rb+ 读写打开一个二进制文件,允许读写数据(可以任意修改),文件必须存在.
if ((pcard = fopen("book.dat", "rb+")) == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
//原代码while (getchar() != '\n');
//原代码printf("请输入查询卡号:\n");
//原代码s_gets(infor, 11);
printf("请输入查询卡号:");
fflush(stdin); //清空输入缓存,吸收掉回车符(有的编译器不适用)
gets(infor);
printf("测试---开始\n");
//原代码for (a = 0; fread(&num[a], size, 1, pcard); a++)
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
if (strncmp(infor, oneItem.num_car, 10) == 0)
{
if(oneItem.state == 0)
{
oneItem.state = 1;
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
else
{
printf("该账户已挂失。");
}
//把文件指针移动到离文件当前位置的-size的地方,也就是退回1个size
//常数SEEK_CUR表示当前位置
fseek(pcard,-size,SEEK_CUR);
fwrite(&oneItem, size, 1, pcard); //写入新数据
//只需找到一个,写入新数据后就退出,如果继续循环,会异常
break;
}
}
}
//原代码fwrite(&num[a], size, 1, pcard);
printf("测试---结束\n");
fclose(pcard);
}
void testWrite() //测试:写入文件
{
struct arm test[5]={{"mon","1001",1.2,0},{"tue","1002",2.3,0},
{"wed","1003",3.4,0},{"thu","1004",4.5,0},
{"fri","1005",5.6,0}};
FILE *pcard;
int size = sizeof(struct arm);
int a;
// wb 只写打开或建立一个二进制文件,只允许写数据
pcard = fopen("book.dat", "wb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
for(a=0;a<5;a++)
{
fwrite(&test[a], size, 1, pcard);
}
fclose(pcard);
}
void testRead() //测试:读取文件
{
struct arm oneItem;
FILE *pcard;
int size = sizeof(struct arm);
int ret;
// rb 只读打开一个二进制文件,只允许读数据
pcard = fopen("book.dat", "rb");
if (pcard == NULL)
{
fputs("无法打开book.dat文件\n", stderr);
exit(1);
}
printf("\n显示文件的数据:\n");
while(!feof(pcard)) //没有到达文件的结尾
{
ret=fread(&oneItem, size, 1, pcard);
if(ret==1)
{
printf("%s %s: $%.2f %d\n", oneItem.name, oneItem.num_car,
oneItem.value, oneItem.state);
}
}
fclose(pcard);
}
int main()
{
testWrite(); //测试:写入文件
testRead(); //测试:读取文件
loss_card();
testRead(); //测试:读取文件
return 0;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯