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

定义结构体

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. AJAX 请求完成时执行函数。Ajax 事件。

    ajaxComplete(callback) 概述 AJAX 请求完成时执行函数.Ajax 事件. XMLHttpRequest 对象和设置作为参数传递给回调函数.大理石直角尺 参数 callback ...

  2. 【原创】谈一个数学教育专业的IT职业生涯

    2003年,有许多值得记住,第一个是非典,第二个就是高考数学卷.直到今年2019年,时隔16年,有人说2019年高考数学卷难度堪比2003年,但还没难到2003年的程度. 我,2003年高考,进考场先 ...

  3. 使用Python操作Excel文档(一)

    Python | 使用Python操作Excel文档(一) 0 前言 在阅读本文之前,请确保您已满足或可能满足以下条件: 请确保您具备基本的Python编程能力. 请确保您会使用Excel. 请确保您 ...

  4. JavaWeb-SpringSecurity实现需求-判断请求是否以html结尾

    系列博文 项目已上传至guthub 传送门 JavaWeb-SpringSecurity初认识 传送门 JavaWeb-SpringSecurity在数据库中查询登陆用户 传送门 JavaWeb-Sp ...

  5. tomcat建立双向https安全连接

    参考:http://www.hangge.com/blog/cache/detail_992.htmltomcat连接器的框架是coyote,有关信息参考:http://blog.csdn.net/w ...

  6. umount 报错was not found in /proc/mounts

    前段时间在整理服务器时,看到nfs都是通过公网调用的,但是实际这几台服务器都是可以内网互通的,为了更稳定的使用,打算把这些挂载都更改为通过内网ip挂载,什么都设置好之后,操作第一台服务器没有问题,um ...

  7. php改变header头返回值

    $code = '400 Bad Request'; header('HTTP/1.1 '.$code);

  8. 如何查看 SELinux状态及关闭SELinux

    查看SELinux状态: 1./usr/sbin/sestatus -v      ##如果SELinux status参数为enabled即为开启状态 SELinux status:         ...

  9. Linux安全工具之fail2ban防爆力破解

    一:简单介绍 fail2ban是一款实用软件,可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作 在企业中,有些很多人会开放root登录,这样就有机会给黑客造成暴力破解的机会 ...

  10. CSS鼠标效果手型效果

    Example:CSS鼠标手型效果 <a href="#" style="cursor:hand">CSS鼠标手型效果</a> Exam ...