C学习笔记-结构体与二进制文件增删改查
使用结构体整理数据,然后利用二进制存储文件,这样存储的文件类似于数据库,可以实现文件的增删改查
定义结构体
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学习笔记-结构体与二进制文件增删改查的更多相关文章
- ASP.NET学习笔记(3)——用户增删改查(三层)
说明(2017-10-6 11:21:58): 1. 十一放假在家也没写几行代码,本来还想着利用假期把asp.net看完,结果天天喝酒睡觉,回去的票也没买到,惨.. 2. 断断续续的把用户信息的页面写 ...
- 【EF学习笔记04】----------EF简单增删改查
第一步:创建上下文对象 using(var db = new Entities()) { //数据操作 } 新增 UserInfo user = new UserInfo() { UserName = ...
- mongo学习笔记(一):增删改查
安装:我是按这篇来弄的 一.Insert 1.db.person.insert({"name":"jack","age":20}) 2.va ...
- Android学习笔记_9_SQLiteOpenHelper对象之数据库增删改查以及事务回滚操作
一.SQLite数据库: 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进 ...
- ASP.NET学习笔记(2)——用户增删改查
说明(2017-7-4 11:48:50): 1. index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...
- SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询
SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...
- ssm学习(四)--完整的增删改查demo
上一篇文章简要介绍了将sping mvc加入整个框架,算是完成了ssm的集成.本节继续前面的内容,结合spring mvc做一个简单的增删改查demo. 1.首先,重写一下GeckoList.jsp页 ...
- Mybatis的学习总结(一)——使用配置文件实现增删改查
在使用Mybatis作为持久层来进行操作数据库,有很多的操作都是一样的,基本上都是先得到session,然后调用session提供的相关方法进行操作,接着提交session,最后关闭session.那 ...
- Django 笔记(六)mysql增删改查
注:增删改查表数据在 views.py 内 添加表数据: 删表数据: 改表数据: 查表数据: 常用的查询方法: 常用的查询条件: 相当于SQL语句中的where语句后面的条件 语法:字段名__规则
随机推荐
- 【C#-多线程】实现每隔一段时间执行代码(多线程) 3种定时器
总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用Sys ...
- Module parse failed: Export 'instance' is not defined (35:19)
Module parse failed: Export 'instance' is not defined (35:19) 使用npm出现的这错误,用yarn就可以了 这种情况rm node_modu ...
- jquery resize()方法 语法
jquery resize()方法 语法 作用:当调整浏览器窗口的大小时,发生 resize 事件.resize() 方法触发 resize 事件,或规定当发生 resize 事件时运行的函数.大理石 ...
- CTS添加新测试用例步骤
一.CTS添加新测试用例: 前言: google源代码中的cts测试用例集目录为:source_android4.2/cts/tests/tests/ (source_android4.2表示andr ...
- 欧拉函数(线性筛)(超好Dong)
欧拉函数:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . #include <bits/stdc++.h> using namespace std; cons ...
- SimpleThreadPool给线程池增加拒绝策略和停止方法
给线程池增加拒绝策略和停止方法 package com.dwz.concurrency.chapter13; import java.util.ArrayList; import java.util. ...
- shell 之 用linux定时任务crontab和watchdog.sh脚本做软件看门狗
1.简介 看门狗的作用是定期检测服务正常运行,如果发现服务不在了,会重新拉起服务:linux中可以利用系统的定时任务功能crontab定期的去执行watchdog.sh脚本,而watchdog.sh脚 ...
- svn 同步备份的所有问题,亲测可用
svnsync 异地同步收获 (2010-07-06 10:06:19) 转载▼ 标签: 杂谈 分类: svn svnsync 异地同步收获: 来自:我用Subversion - http://www ...
- PHP 分页+查询
首先是主页面,与上篇分页页面相同 <table width="100%" border="1" cellpadding="0" cel ...
- 调用远程linux服务器shell脚本
package com.haiyisoft.hyoaPc.ui; import java.io.BufferedReader;import java.io.IOException;import jav ...