使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查

定义结构体

struct student
{
unsigned int ID;
char name[20];
};

创建二进制文件

int main(int argc, char *args[])
{
struct student st[10] = { {1, "a"}, {2, "b"}, {3, "c"}, {4,"d"}, {5, "e"}, {6, "f"}, {7, "g"}, {8, "h"}, {9, "i"}, {10, "j"} }; FILE *p = fopen("a.dat", "wb");
if (p == NULL)
{
return 0;
}
fwrite(st, sizeof(struct student), 10, p);//写入10个struct student大小的内容
fclose(p);
return 0;
}

读取内容

int main()
{
FILE *p = fopen("a.dat", "rb");
if (p == NULL)
{
return 0;
} struct student st;
memset(&st, 0, sizeof(st));
while (fread(&st, sizeof(st), 1, p))//循环读取文件所有内容
{
printf("ID = %u, name = %s\n", st.ID, st.name);
}
fclose(p);
return 0;
}

替换内容

int main(int argc, char *args[])//替换第3个元素
{
struct student st = { 3, "zhang" }; FILE *p = fopen("a.dat", "rb+");
if (p == NULL)
{
return 0;
}
fseek(p, sizeof(st)* 2, SEEK_SET);//从文件开始位置向后移动两个struct student大小
fwrite(&st, sizeof(struct student), 1, p);//将st写入文件
fclose(p);
return 0;
}

根据ID查找内容

int main()//根据用户输入查找指定ID号的同学
{
FILE *p = fopen("a.dat", "rb");
if (p == NULL)
{
return 0;
}
struct student st;
while (1)//循环读取用户键盘输入ID号
{ printf("input ID:");
unsigned int ID = 0;
scanf("%u", &ID);
if (ID == 0)
break;
clock_t ct = clock();//得到程序当前运行时间,单位毫秒
fseek(p, sizeof(st)* (ID - 1), SEEK_SET);//根据用户输入ID好,将位置移动到指定位置 memset(&st, 0, sizeof(st));
fread(&st, sizeof(st), 1, p);//读取指定位置内容
ct = clock() - ct;
printf("%d\n", ct);//将代码执行时长打印到屏幕,单位:毫秒
printf("ID = %u, name = %s\n", st.ID, st.name);
}
fclose(p);
return 0;
}

插入内容

其主要思想是全部查出,然后添加,再写入

void insert(struct student array[], int len)
{
for (int i = len - 1; i >= 2; i--)
{
array[i + 1] = array[i];
}
} int main()//读取结构体二进制文件所有内容
{
FILE *p = fopen("a.dat", "rb");//只读方式打开二进制文件
if (p == NULL)
{
return 0;
}
struct student *pst = calloc(100, sizeof(struct student));
int index = 0;
while (fread(&pst[index++], sizeof(struct student), 1, p) > 0);//循环读取文件所有内容
insert(pst, index);
pst[2].ID = 100;
strcpy(pst[2].name, "zhao");
for (int i = 0; i < index + 1; i++)
{
printf("ID = %u, name = %s\n", pst[i].ID, pst[i].name);
}
fclose(p);
p = fopen("a.dat", "wb");
if (p == NULL)
{
return 0;
}
fwrite(pst, sizeof(struct student), 11, p);
fclose(p);
free(pst);
return

例子

将txt文本文件转为二进制文件,并随机编号

#include <stdio.h>
#include <time.h> struct student
{
unsigned int ID;
char name[20];
}; void write_dat()
{
srand((unsigned int)time(NULL));//生成一个随机种子
FILE *p1 = fopen("student.txt", "r");//以只读方式打开student.txt文件
FILE *p2 = fopen("student.dat", "wb");//以只读方式打开student.txt文件
while (!feof(p1))
{
struct student st = { 0, "" };
fgets(st.name, sizeof(st.name), p1);
size_t len = strlen(st.name);
if (st.name[len - 1] == '\n')
{
st.name[len - 1] = 0;
}
st.ID = rand();
fwrite(&st, sizeof(struct student), 1, p2);
}
fclose(p1);
fclose(p2);
} int main()
{
write_dat();
FILE *p = fopen("student.dat", "rb");
if (p == NULL)
{
return 0;
}
struct student st;
while (fread(&st, sizeof(st), 1, p) > 0)
{
printf("ID = %u, name = %s\n", st.ID, st.name);
}
fclose(p);
return 0;
}

C学习笔记-结构体与二进制文件增删改查的更多相关文章

  1. ASP.NET学习笔记(3)——用户增删改查(三层)

    说明(2017-10-6 11:21:58): 1. 十一放假在家也没写几行代码,本来还想着利用假期把asp.net看完,结果天天喝酒睡觉,回去的票也没买到,惨.. 2. 断断续续的把用户信息的页面写 ...

  2. 【EF学习笔记04】----------EF简单增删改查

    第一步:创建上下文对象 using(var db = new Entities()) { //数据操作 } 新增 UserInfo user = new UserInfo() { UserName = ...

  3. mongo学习笔记(一):增删改查

    安装:我是按这篇来弄的 一.Insert 1.db.person.insert({"name":"jack","age":20}) 2.va ...

  4. Android学习笔记_9_SQLiteOpenHelper对象之数据库增删改查以及事务回滚操作

    一.SQLite数据库: 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进 ...

  5. ASP.NET学习笔记(2)——用户增删改查

    说明(2017-7-4 11:48:50): 1. index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  6. SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询

    SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...

  7. ssm学习(四)--完整的增删改查demo

    上一篇文章简要介绍了将sping mvc加入整个框架,算是完成了ssm的集成.本节继续前面的内容,结合spring mvc做一个简单的增删改查demo. 1.首先,重写一下GeckoList.jsp页 ...

  8. Mybatis的学习总结(一)——使用配置文件实现增删改查

    在使用Mybatis作为持久层来进行操作数据库,有很多的操作都是一样的,基本上都是先得到session,然后调用session提供的相关方法进行操作,接着提交session,最后关闭session.那 ...

  9. Django 笔记(六)mysql增删改查

    注:增删改查表数据在 views.py 内 添加表数据: 删表数据:  改表数据:  查表数据: 常用的查询方法: 常用的查询条件: 相当于SQL语句中的where语句后面的条件 语法:字段名__规则

随机推荐

  1. hdu 6078 Wavel Sequence

    题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6078 (2017 Multi-University Training Contest - Team ...

  2. Java基础重点

    几个比较重要基础的,以后用到概率比较大的合集. 第一个,是获取时间以字符串形式输出的,用到了Date类.simpleDateFormat类的方法.贴图: 第二个是字符串转时间类型的,与上一个相似,不过 ...

  3. jpa单向一对多

    单向一对多是一个类中的一条记录可对应另一个类的多条记录: 比如一个部门可对应多个员工:   jpa中的实现步骤:     one-to-many的one类中添加一个many类类型的set;比如部门类D ...

  4. php+列出目录文件

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个php文件夹上传下载的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助.此控件PC全平台支持包括mac,li ...

  5. css基础(css书写 背景设置 标签分类 css特性)

      css书写位置   行内式写法 <p style="color:red;" font-size:12px;></p> 外联式写法 <link re ...

  6. zabbix-server服务端配置文件

    [root@node7 ~]# vim /etc/zabbix/zabbix_server.conf ##日志文件 LogFile=/var/log/zabbix/zabbix_server.log ...

  7. (十三)C语言之break、continue

  8. 苹果用户转入mate30,被恶心到了

    几年没更新博客了,今天入了新坑,一堆东西想吐槽,发一篇喷一波. 几千块的机器,牛皮癣广告居然这么鬼多,预装一打,推荐一打,不比千元机少,这TM是旗舰机啊.华为官方产的 app打着服务旗号,不给权限强退 ...

  9. springboot拦截异常信息发送邮件提醒

    -- private JavaMailSender sender; 可能会出现注入错误,请注意yam配置文件中格式是否一致:否则会找不到注入的bean 一 发送邮件 在Springboot中发送邮件非 ...

  10. Python中的OS对路径的操作以及应用

    目录处理 OS目录处理目录-->路径,文件夹 文件:html 1. 新建和删除一个目录import os #引入os目录from xx import xxos.mkdir("D:\\P ...