将整数,结构体,结构体数组,链表写到文件

在之前的学习中,忘文件中写的内容都是字符串或字符,本节学习如何写入其他各种类型的数据。

回看write和read函数的形式:

ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);

其中,第二个参数都是一个无类型的指针,只不过之前一直将这里定义为一个字符串,其实,这个指针可以指向各种形式数据的地址。 

写入一个整数

demo7.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main()
{
	int fd; // file description
	int data = 100;
	int data2 = 0;

	fd = open("./file1",O_RDWR|O_CREAT|O_TRUNC, 0600);

	printf("file description = %d, open successfully!\n",fd);

	write(fd, &data, sizeof(int));

	lseek(fd,0,SEEK_SET);

	read(fd, &data2, sizeof(int));
        printf("context:%d\n",data2);

	close(fd); //close after writing 

	return 0;
}

运行代码:

注意,如果此时打开file1:(此时需要使用vi打开)

发现是乱码,但是这并不影响程序运行时的读取和写入

写入一个结构体

demo7.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


struct Test
{
	int i;
	char c;
};

int main()
{
	int fd; // file description
	struct Test data = {30,'k'};
	struct Test data2;

	fd = open("./file1",O_RDWR|O_CREAT|O_TRUNC, 0600);

	printf("file description = %d, open successfully!\n",fd);

	write(fd, &data, sizeof(struct Test));

	lseek(fd,0,SEEK_SET);

	read(fd, &data2, sizeof(struct Test));
        printf("data.i:%d,data.c=%c\n",data2.i,data2.c);

	close(fd); //close after writing 

	return 0;
}

运行代码:

 

 

 写入一个结构体数组

demo7.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>


struct Test
{
	int i;
	char c;
};

int main()
{
	int fd; // file description
	struct Test data[2] = {{30,'k'},{100,'p'}};
	struct Test data2[2];

	fd = open("./file1",O_RDWR|O_CREAT|O_TRUNC, 0600);

	printf("file description = %d, open successfully!\n",fd);

	write(fd, &data, sizeof(struct Test)*2);

	lseek(fd,0,SEEK_SET);

	read(fd, &data2, sizeof(struct Test)*2);
        printf("data[0].i:%d,data[0].c=%c\n",data2[0].i,data2[0].c);
	printf("data[1].i:%d,data[1].c=%c\n",data2[1].i,data2[1].c);

	close(fd); //close after writing 

	return 0;
}

 运行代码:

写入一个链表 

demo7.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

struct Test
{
	int data;
	struct Test *next;
};


int main()
{
	int fd; // file description
	struct Test head = {20,NULL};
	struct Test node1 = {30,NULL};
	struct Test node2 = {40,NULL};
	head.next = &node1;
	node1.next = &node2;


	fd = open("./file1",O_RDWR|O_CREAT|O_TRUNC, 0600);

	printf("file description = %d, open successfully!\n",fd);


	write(fd, &head, sizeof(struct Test));
	write(fd, &node1, sizeof(struct Test));
	write(fd, &node2, sizeof(struct Test));


	lseek(fd,0,SEEK_SET);

	struct Test node_read_1 = {0,NULL};
	struct Test node_read_2 = {0,NULL};
	struct Test node_read_3 = {0,NULL};
 	read(fd, &node_read_1, sizeof(struct Test)); 
	read(fd, &node_read_2, sizeof(struct Test));
	read(fd, &node_read_3, sizeof(struct Test));
	
	printf("no.1=%d\n",node_read_1.data);
	printf("no.2=%d\n",node_read_2.data);
	printf("no.3=%d\n",node_read_3.data);


	close(fd);

	return 0;
}

运行代码:

 

但是以上的代码有点笨,且容错性太低,首先读取和写入应该封装成函数,并且我认为通常在读取链表的时候,不一定知道链表有多少元素,所以应该一边用尾插法动态创建链表一边读取

改进代码demo8.c:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

struct Test
{
	int data;
	struct Test *next;
};

struct Test *insertBehind(struct Test *head, struct Test *new)
{
	struct Test *p = head;
	if(p == NULL){
		head = new;
		return head;
	}

	while(p->next != NULL){
		p = p->next;
	} //将p先移动到链表的尾部
	p->next = new;

	return head;
}

void writeLink2File(int fd,struct Test *p){

	while(p != NULL){
		write(fd, p, sizeof(struct Test));
		p = p->next;
	}
}

void readLinkFromFile(int fd,struct Test *head){
	struct Test *new;
	int size = lseek(fd,0,SEEK_END); //先计算文件大小
	lseek(fd,0,SEEK_SET); //然后不要忘记把光标移到文件头

	while(1){
		new = (struct Test *)malloc(sizeof(struct Test));
		read(fd, new, sizeof(struct Test));
		printf("link data:%d\n",new->data);
		if(lseek(fd,0,SEEK_CUR) == size){ //每次读取一个数据之后,动态创建下一个链表节点之前,都要判断“当前光标是否已经在文件尾”,如果是,说明读取已经完成
			printf("read finish\n");
			break;
		}
		head = insertBehind(head,new);
	}

}



int main()
{
	int fd; // file description
	struct Test head = {20,NULL};
	struct Test node1 = {30,NULL};
	struct Test node2 = {40,NULL};
	head.next = &node1;
	node1.next = &node2;

	fd = open("./file1",O_RDWR|O_CREAT|O_TRUNC, 0600);

	printf("file description = %d, open successfully!\n",fd);

	writeLink2File(fd,&head);

	struct Test *head_recv = NULL; //准备创建一个新的链表用于接收
 	readLinkFromFile(fd,head_recv);

	close(fd);

	return 0;
}

改进代码运行:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/63794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机图形学一:数学基础

数学基础&#xff08;变换矩阵&#xff0c;向量运算等&#xff09; 1.变换矩阵总结 一切物体&#xff08;包括模型&#xff0c;向量等&#xff09;的缩放&#xff0c;旋转&#xff0c;平移&#xff0c;切变等&#xff0c;都可以通过变换矩阵得到。在投影(projection&#xff…

MyCat垂直分库案例以及全局表概念讲解

这里的分片指的就是分库分表 1.垂直拆分 1.1场景介绍 1.2 数据库准备 1.3MyCat配置 schema.xml: <schema name"shopping" checkSQLschema"true" sqlMaxLimit"100"><table name"tb_goods_base" dataNode"dn1" pr…

Git基础知识:常见功能和命令行

文章目录 1.Git介绍2.安装配置2.1 查看配置信息 3.文件管理3.1 创建仓库3.2 版本回退3.3 工作流程3.4 撤销修改3.5 删除文件 4.远程仓库4.1 连接远程库4.2 本地上传至远程4.3 从远程库克隆到本地 5.分支管理5.1 创建分支5.2 删除分支5.3 合并分支解决冲突 参考&#xff1a; Git…

python与深度学习(十五):CNN和宝可梦模型

目录 1. 说明2. 宝可梦模型2.1 导入相关库2.2 建立模型2.3 模型编译2.4 数据生成器2.5 模型训练2.6 模型保存 3. 宝可梦的CNN模型可视化结果图4. 完整代码5. 宝可梦的迁移学习 1. 说明 本篇文章是CNN的另外一个例子&#xff0c;宝可梦模型&#xff0c;是自制数据集的例子。之前…

b站视频标题的获取(xpath、jsonpath的一个简单应用)

目录 1.目的2.代码的演示 注&#xff1a;该篇文章为本人原创&#xff0c;由于本人学习有限&#xff0c;若有错误或者笔误或者有问题&#xff0c;欢迎大家进行批评指正&#xff0c;谢谢。 1.目的 在b站大学上&#xff0c;为了更好的写笔记&#xff0c;本人根据学到的Python(即Py…

element vue2 动态添加 select+tree

难点在 1 添加一组一组的渲染 是往数组里push对象 循环的&#xff1b;但是要注意对象的结构! 因为这涉及到编辑完成后&#xff0c;表单提交时候的 校验&#xff01; 是校验每一个select tree里边 是否勾选 2 是在后期做编辑回显的时候 保证后端返回的值 是渲染到 select中的tr…

C语言案例 按序输出多个整数-03

难度2复杂度3 题目&#xff1a;输入多个整数&#xff0c;按从小到大的顺序输出 步骤一&#xff1a;定义程序的目标 编写一个C程序&#xff0c;随机输入整数&#xff0c;按照从小到大的顺序输出 步骤二&#xff1a;程序设计 整个C程序由三大模块组成&#xff0c;第一个模块使…

实战项目——多功能电子时钟

一&#xff0c;项目要求 二&#xff0c;理论原理 通过按键来控制状态机的状态&#xff0c;在将状态值传送到各个模块进行驱动&#xff0c;在空闲状态下&#xff0c;数码管显示基础时钟&#xff0c;基础时钟是由7个计数器组合而成&#xff0c;当在ADJUST状态下可以调整时间&…

AlexNet卷积神经网络-笔记

AlexNet卷积神经网络-笔记 AlexNet卷积神经网络2012年提出 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c; 在眼疾筛查数据集iChallenge-PM上使用AlexNet&#xff0c;loss能有效下降&#xff0c; 经过5个epoch的训练&#xff0c;在验证集上的准确率可以达到94%左右…

电源控制--品质因素Q值全解

什么是品质因素Q值&#xff1f; 在电源控制中&#xff0c;品质因素 Q 值通常用于描述电源滤波器的性能。电源滤波器用于减小电源中的噪声和干扰&#xff0c;以提供干净稳定的电源供应给电子设备。 品质因素 Q 值在电源滤波器中表示滤波器的带宽和中心频率之比&#xff0c;用于…

SpringBoot集成百度人脸识别实现登陆注册功能Demo(二)

前言 上一篇SpringBoot集成百度人脸demo中我使用的是调用本机摄像头完成人脸注册&#xff0c;本次demo根据业务需求的不同我采用文件上传的方式实现人脸注册。 效果演示 注册 后端响应数据&#xff1a; 登录 后端响应数据&#xff1a; 项目结构 后端代码实现 1、BaiduAiUtil…

【C++学习】STL容器——list

目录 一、list的介绍及使用 1.1 list的介绍 1.2 list的使用 1.2.1 list的构造 1.2.2 list iterator的使用 1.2.3 list capacity 1.2.4 list element access 1.2.5 list modifiers 1.2.6 list 迭代器失效 二、list的模拟实现 2.1 模拟实现list 三、list和vector的对比…

8月1日上课内容 第一章web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层--传输层---网络层----数据链路层-----物理层 ip地址&#xff0c;我们每一台主机都有一个唯一的地址标识(固定的ip地址)&#xff0c;区分用户和计算机通信。 ip地址:32位二进制数组成的&#xff0c;不方便记忆 192.168.…

SpringMVC -- REST风格开发,RESTful快速开发、RESTful注解开发

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 REST 一、REST简介1.1REST风格简介 二、RESTful入门案例2.…

绘制曲线python

文章目录 import matplotlib.pyplot as plt# 提供的数据 x= [1,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,1.9,2,2.1,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9,3,3.1,3.2,3.3,3.4,3.5,3.6,3.7,3.8,3.9,4,4.1,4.2,4.3,4.4,4.5,4.6,4.7,4.8,4.9,5,5.1,5.2,5.3,5.4,5.5,5.6,5.7,5.8,5.9,6,6.1,6.2…

门面模式(C++)

定义 为子系统中的一组接口提供一个一致(稳定) 的界面&#xff0c;Facade模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用(复用)。 应用场景 上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合&#xff0c;随着外部客户程序和各子…

代码随想录算法训练营day55

文章目录 Day55 判断子序列题目思路代码 不同的子序列题目思路代码 Day55 判断子序列 392. 判断子序列 - 力扣&#xff08;LeetCode&#xff09; 题目 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以…

java文件

一.File类 二.扫描指定目录&#xff0c;并找到名称中包含指定字符的所有普通文件&#xff08;不包含目录&#xff09;&#xff0c;并且后续询问用户是否要删除该文件 我的代码: import java.io.File; import java.io.IOException; import java.util.Scanner;public class Tes…

Excel功能总结

1&#xff09;每一张表格上都打印表头 “页面布局”-->“打印标题”-->页面设置“工作表”页-->打印标题“顶端标题行” 如&#xff1a;固定第1~2行&#xff0c;设置成“$1:$2” 2&#xff09;将页面内容打印在一页【缩印】 1.选好需要打印的区域&#xff0c;“页面布…

数据结构 | 利用二叉堆实现优先级队列

目录 一、二叉堆的操作 二、二叉堆的实现 2.1 结构属性 2.2 堆的有序性 2.3 堆操作 队列有一个重要的变体&#xff0c;叫作优先级队列。和队列一样&#xff0c;优先级队列从头部移除元素&#xff0c;不过元素的逻辑顺序是由优先级决定的。优先级最高的元素在最前&#xff…