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

news2024/12/29 13:22:31

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

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

改进代码运行:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(论文复现)DeepAnt模型复现及应用

DeepAnt论文如下&#xff0c;其主要是用于时间序列的无监督粗差探测。 其提出的模型架构如下&#xff1a; 该文提出了一个无监督的时间序列粗差探测模型&#xff0c;其主要有预测模块和探测模块组成&#xff0c;其中预测模块的网络结构如下。 预测结构是将时间序列数据组…

mfc100u.dll丢失的多种解决方法分享,最新的修复mfc100u.dll方案

mfc100u.dll丢失可以说是见怪不怪的了&#xff0c;只要经常使用电脑的人&#xff0c;一般都会碰到一两次这种dll文件缺失的情况&#xff0c;今天主要是来给大家讲解一下mfc100u.dll丢失的多种解决方法&#xff0c;让你以后遇到这情况再也不需要头大。 一.mfc100u.dll为啥会丢失…

【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)

UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats NDSS-2020 哈佛大学 Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020. 源码&…

无人驾驶实战-第九课(预测系统)

PNC PNCPlanning and Control&#xff0c; 其中包括&#xff1a;预测、全局路径规划、计划&#xff08;决策、路径规划、速度&#xff09;及控制。 各公司无人驾驶的整体水平 预测 很多无人驾驶的工作都需要给予预测的结果。预测的需求是准确率和实时性&#xff0c;难点是较为少…

利用MMPose进行姿态估计(训练、测试全流程)

前言 MMPose是一款基于PyTorch的姿态分析开源工具箱&#xff0c;是OpenMMLab项目成员之一&#xff0c;主要特性&#xff1a; 支持多种人体姿态分析相关任务&#xff1a;2D多人姿态估计、2D手部姿态估计、动物关键点检测等等更高的精度和更快的速度&#xff1a;包括“自顶向下”…

mybtis-plus分页查询

文章目录 2.2 代码开发2.2.1 设计DTO类2.2.2 封装PageResult2.2.3 Controller层2.2.4 Service层接口2.2.5 Service层实现类2.2.6 Mapper层 3.3 代码实现3.3.1 分页插件配置3.3.2 分页查询实现 2.2 代码开发 2.2.1 设计DTO类 根据请求参数进行封装&#xff0c;在sky-pojo模块中…

macbook 安装 Git 和 安装 Homebrew

使用MacBook 时&#xff0c;需要拉取代码&#xff0c;我们需要使用到 Git&#xff0c;但 MacBook 中并没安装&#xff0c;这里我们分享一下安装过程。其他方式可查看参考文献中的方法。 一、使用终端直接安装 在新版的 MacBook 中&#xff0c;可以使用终端直接安装 Git&#…

【流量、日志分析】常见的web流量分析、windows日志分析

1.web流量分析 1.1 特点 通常会提供一个包含流量数据的 PCAP 文件&#xff0c;有时候也会需要先进行修复或重构传输文件后&#xff0c;再进行分析。 复杂的地方在于数据包里充满着大量无关的流量信息&#xff0c;因此如何分类和过滤数据是我们需要做的。 1.2 流量包修复 例…

Docker网络模型:理解容器网络通信和连接

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

第 357 场力扣周赛题解

A 故障键盘 简单模拟 class Solution { public:string finalString(string s) {string res;for (auto c: s)if (c ! i)res.push_back(c);elsereverse(res.begin(), res.end());return res;} };B 判断是否能拆分数组 区间dp&#xff1a;定义 p i , j p_{i,j} pi,j​表示子数组 n…

预测知识 | 预测模型变量重要性、可视化及论文撰写指南

预测知识 | 预测模型变量重要性、可视化及论文撰写指南 目录 预测知识 | 预测模型变量重要性、可视化及论文撰写指南变量重要性模型可视化论文撰写指南参考资料 变量重要性 关于预测模型变量重要性&#xff0c;大家一定熟悉不过。但如下图所示&#xff0c;其展示上可有进一步优…

ServiceAccount深度解析

ServiceAccount为Pod钟的进程提供身份信息。当用户访问集群时&#xff08;例如使用kubectl命令的时候&#xff09;&#xff0c;apiserver会将用户认证为一个特定的User Account&#xff08;目前通常是admin&#xff0c;除非系统管理员自定义了集群配置&#xff09;。Pod容器中的…

Pytest测试框架2

目录&#xff1a; pytest参数化用例pytest标记测试用例pytest设置跳过、预期失败用例pytest运行用例pytest测试用例调度与运行pytest命令行常用参数python执行pytestpytest异常处理 1.pytest参数化用例 参数化 通过参数的方式传递数据&#xff0c;从而实现数据和脚本分离。…

C++三个线程依次打印abc

代码 #include<iostream> #include<thread> #include<mutex> #include<condition_variable> using namespace std; mutex mtx; condition_variable cv; int flag0; void A(){unique_lock<mutex>lk(mtx);int count0;while(count<10){while(fl…

【工程实践】使用EDA(Easy Data Augmentation)做数据增强

工程项目中&#xff0c;由于数据量不够&#xff0c;经常需要用到数据增强技术&#xff0c;尝试使用EDA进行数据增强。 1.EDA简介 EDA是一种简单但是非常有效的文本数据增强方法&#xff0c;是由美国Protago实验室发表于 EMNLP-IJCNLP 2019 会议。EDA来自论文《EDA: Easy Data…

AI Chat 设计模式:12. 享元模式

本文是该系列的第十二篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下享元模式A.1Q.2 也就是说&#xff0c;其实共享的是对象的内部状态&…

【Pytorch】P0 Windows 安装 Pytorch

Windows安装Pytorch 前言PyTorch&#xff0c;CUDA与GPUCUDA ToolkitSo...总而言之 整体流程一&#xff1a;安装 CUDA Toolkit步骤一&#xff1a;获取CUDA版本信息步骤二&#xff1a;下载安装 CUDA Toolkit步骤三&#xff1a;按照默认步骤安装步骤四&#xff1a;检查CUDA安装成功…

Android应用开发(6)TextView进阶用法

Android应用开发学习笔记——目录索引 上一章Android应用开发&#xff08;5&#xff09;文本视图&#xff08;TextView&#xff09;介绍了文本视图&#xff08;TextView&#xff09;设置文本内容、设置文本大小、设置文本显示颜色。 TextView是最基础的文本显示控件&#xff…

cpu的几核和几线程是什么意思

先说一下i7-12800H 14核 20线程是什么意思 答: 超线程功能先简单的解释下就是:能使一个大核拥有同时处理两个线程的能力. 14核是大小核技术,6个大核,8个小核,小核没有超线程功能 ,比大核的性能要弱些 也就是说6个大核,每个大核都同时处理2个线程, 每个小核只能同时处理…

Vue缓存字典值减少网络请求次数,解决同样参数并发请求多次

前言 在一些项目里&#xff0c;我们可能有着大量的下拉框&#xff0c;而这些下拉框的数据就来源于我们后端接口返回的字典信息。于是&#xff0c;画风可能是这样的&#xff0c;每次下拉&#xff0c;你都需要请求一次字典接口拿到这些数据&#xff0c;于是每次组件刷新都会重复…