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

定义结构体

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;
}

最新文章

  1. 2013 duilib入门简明教程 -- 部分bug 2 (14)
  2. 研究一下javascript的模块规范(CommonJs/AMD/CMD)
  3. 【自动化学习笔记】_环境搭建Selenium2+Eclipse+Java+TestNG_(一)
  4. SharePoint Online 创建门户网站系列之准备篇
  5. 百度地图 IOS版开发经验分享
  6. 创建gbk编码
  7. hdu1059 Dividing ——多重背包
  8. VC 获 取 当前程序运行路径的几种方法
  9. 初识 css3中counter属性
  10. 【风马一族_Android】多选按钮的监控事件
  11. jquery-动态设置ul li a链接目标
  12. 读取和存储文本文件,UTF-8和GB2312通用的函数
  13. EAS(学生管理系统)初建
  14. vue插件官方文档,做个记录
  15. $.ajax的标准写法
  16. mysql的简单安装方法
  17. git 免密码push
  18. 【Teradata】并行操作工具
  19. java问题
  20. 牛客网 完数VS盈数

热门文章

  1. Ubuntu 16.04安装docker详细步骤
  2. 什么是URL百分号编码?
  3. windows安装解压版postgresql
  4. JavaScript 实现文件下载并重命名
  5. PTA 重构二叉树
  6. js计算textarea输入文字的长度
  7. C与C++ 中 struct和typedef struct
  8. 阿里云OSS细粒度权限控制
  9. 20175215 2018-2019-2 第十一周java课程学习总结
  10. 7 Java 快速排序