永发信息网

C语言,使用结构体保存的文件,再次打开修改后怎样把新数据保存在原位置(附代码,希望可以帮忙修改)

答案:1  悬赏:40  手机版
解决时间 2021-01-24 14:58
  • 提问者网友:喧嚣尘世
  • 2021-01-23 21:08
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);
}
最佳答案
  • 五星知识达人网友:忘川信使
  • 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;
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯