| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1178 人关注过本帖
标题:有关二进制文件操作的问题
只看楼主 加入收藏
gentry422
Rank: 2
等 级:论坛游民
帖 子:6
专家分:15
注 册:2017-12-5
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
有关二进制文件操作的问题
事先定义了结构体
例如:struct
{ char name[10];
char number[];
}classmate[10];
并且已经将数据写入了二进制文件
但是如何实现对任意一个结构体的某个数据进行修改,并写入二进制文件中中?
比如我要修改 名字是张三的number信息(张三的信息在文件中存在)

边读编写以前文件的数据怎么办?会不会丢失?
我现在要解决的问题是 一个文件中有了很多数据。我想通过找到一个人的姓名来修改他的其他数据,另外的数据不变,文件名也不变,请问这个如何实现。
我的想法如下,可是无法实现。我是新手,麻烦大神了   
typedef struct
{
    char name[10];
    char nickname[10];
    char province[10];
    char qqnum[13];
    char phonenum[13];
    char university[22];
    char profession[20];
    char remark[20];
}Classmate;
Classmate addr[SIZE];

void rewrite()
{
    FILE *fp;
    int i;
    char x[20],y[20];
    if(!(fp=fopen("class_list","rb+")))
    {
        printf("Cannot open the file!");
        exit(0);
    }
    printf("请输入你要找修改的名字:");           //用i找出那个人的地址
    scanf("%s",&x);
    for(i=0;fread(&addr[i],sizeof(Classmate),1,fp)!=0;++i)
    {
        if(strcmp(addr[i].name,x)==0) break;            
    }
    printf("修改为:");                          //修改那个人的nickname
    scanf("%s",&y);
    if(fwrite(&addr[i].name,sizeof(addr[i].nickname),1,fp)!=1)
    {
        printf("error");
        exit (0);
    }
    else{printf("sucess!");}
            fclose(fp);
}  

[此贴子已经被作者于2017-12-5 13:50编辑过]

搜索更多相关主题的帖子: 文件 char 数据 修改 printf 
2017-12-05 10:16
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:10 
1、文件全部读入,修改后重写文件
2、边读边修改
#include <stdio.h>
#include <string.h>

typedef struct classmate
{
    char name[10];
    char number[10];
} CLASSMATE, *PCLASSMATE;

void prn(PCLASSMATE p, int n)
{
    int i;
    for (i=0; i<n; ++i,++p)
        printf("%s\t%s\n", p->name, p->number);
}

main()
{
    //建文件
    CLASSMATE cms[3]= {"李四","101", "张三","202", "王五","303"};
    prn(cms, 3);
    FILE *fp=fopen("test.dat", "wb");
    fwrite(cms, sizeof(CLASSMATE), 3, fp);
    fclose(fp);
    //修改文件
    CLASSMATE cm;
    fp = fopen("test.dat", "rb+");
    while (fread(&cm,sizeof(CLASSMATE),1,fp)==1)
    {
        if (strcmp(cm.name,"张三")==0)
        {
            strcpy(cm.number, "222");
            fseek(fp, (-1)*sizeof(CLASSMATE), SEEK_CUR);
            fwrite(&cm, sizeof(CLASSMATE), 1, fp);
            break;
        }
    }
    fclose(fp);
    printf("修改结果\n");
    fp = fopen("test.dat", "rb");
    fread(cms, sizeof(CLASSMATE), 3, fp);
    fclose(fp);
    prn(cms, 3);
}
2017-12-05 12:04
gentry422
Rank: 2
等 级:论坛游民
帖 子:6
专家分:15
注 册:2017-12-5
收藏
得分:0 
回复 2楼 吹水佬
但是还有个问题,,那个CLASSMATE cm;定义这个有什么用?不了解这个用法,能讲讲吗?

[此贴子已经被作者于2017-12-5 14:33编辑过]

2017-12-05 13:24
gentry422
Rank: 2
等 级:论坛游民
帖 子:6
专家分:15
注 册:2017-12-5
收藏
得分:0 
回复 2楼 吹水佬
谢谢,我已试过能修改

[此贴子已经被作者于2017-12-5 14:32编辑过]

2017-12-05 13:36
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:10 
最好给class_list文件测试。
试试:
void rewrite()
{
    Classmate cm;
    char name[20];
    FILE *fp;
    if(!(fp=fopen("class_list","rb+")))
    {
        printf("Cannot open the file!");
        exit(0);
    }
    printf("请输入你要找修改的名字:");
    scanf("%s", name);
    while (fread(&cm,sizeof(Classmate),1,fp) == 1)
    {
        if (strcmp(cm.name,name) == 0)
        {
            printf("修改为:");
            scanf("%s", cm.name);
            fseek(fp, (-1)*sizeof(Classmate), SEEK_CUR);
            if (fwrite(&cm, sizeof(Classmate), 1, fp) != 1)
            {
                printf("error");
                exit (0);
            }
            break;
        }
    }
    if (!feof(fp))
        printf("sucess!\n");
    else
        printf("找不到 %s 的记录!\n", name);
    fclose(fp);
}
2017-12-05 14:32
快速回复:有关二进制文件操作的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026521 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved