Linux系统编程_文件编程第2天:写整数、结构体,fopen等

news2024/11/20 13:38:00

1. 文件编程小应用之修改程序的配置文件(407.10)

在这里插入图片描述

  • FILE/demo14.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv){
	int fdSrc;

	char *readBuf=NULL;

	if(argc != 2){
		printf("pararm error\n");
		exit(-1);
	}

	fdSrc = open(argv[1],O_RDWR);//打开要修改的源配置文件
	
	int size = lseek(fdSrc,0,SEEK_END);
	readBuf=(char *)malloc(sizeof(char)*size + 8);//给readBuf开辟空间
	
	lseek(fdSrc,0,SEEK_SET);
	int n_read = read(fdSrc,readBuf,size);//读源文件
	
	char *p = strstr(readBuf,"LENG=");//找到readBuf中“LENG=”的首地址(即L)
	if(p==NULL){
		printf("not found\n");
		exit(-1);
	}
	
	p = p+strlen("LENG=");//偏移至“LENG=”之后的一位
	*p = '5';//修改源文件需要更改的字符为'5'	
	
	lseek(fdSrc,0,SEEK_SET);//定位至源文件头部
	int n_write = write(fdSrc,readBuf,strlen(readBuf));//写入修改后的readBuf
	
	close(fdSrc);//关闭源文件

	return 0;
}

在这里插入图片描述

2. 写一个整数到文件(408.11)

  • FILE/demo15.c(不能直接写数字5)
*p = 5;//不能直接写数字5
  • FILE/demo16.c(写入一个整数)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(){
	int fd;
	
	int data = 100;
	int data2;

	fd = open("./file1",O_RDWR);

	int n_write = write(fd,&data,sizeof(int));//把100写到fd

	lseek(fd,0,SEEK_SET);

	int n_read = read(fd, &data2, sizeof(int));//从fd读数据放到data2
	
	printf("read %d \n",data2);
	close(fd);

	return 0;
}

在这里插入图片描述

  • FILE/demo17.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 a;
	char c;
};

int main(){
	int fd;
	
	struct Test data = {100,'a'};
	struct Test data2;

	fd = open("./file1",O_RDWR|O_TRUNK);//打开

	int n_write = write(fd,&data,sizeof(struct Test));//写结构体

	lseek(fd,0,SEEK_SET);//定位头

	int n_read = read(fd,&data2,sizeof(struct Test));//读
	
	printf("read %d,%c \n",data2.a,data2.c);//打印
	
	close(fd);//关闭

	return 0;
}

在这里插入图片描述

3. 写结构体数组到文件(409.12)

  • FILE/demo18.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 a;
	char c;

};

int main()
{
	int fd;
	
	struct Test data[2] = {{100,'a'},{101,'b'}};
	struct Test data2[2];

	fd = open("./file1",O_RDWR);
	int n_write = write(fd,&data,sizeof(struct Test)*2);//数组可以直接读写,因其地址空间是连续的,可以读写一个块
							    //链表不可,应当遍历链表,一次读一个结构体						
	lseek(fd,0,SEEK_SET);

	int n_read = read(fd, &data2, sizeof(struct Test)*2);
	
	printf("read %d,%c \n",data2[0].a,data2[0].c);
	printf("read %d,%c \n",data2[1].a,data2[1].c);
	close(fd);

	return 0;
}

在这里插入图片描述

4. 标准C库对文件操作引入(410.13)

  • 总结open与fopen的区别(*面试会问)
    • https://www.cnblogs.com/NickyYe/p/5497659.html
      在这里插入图片描述

5. 标准C库打开创建文件读写文件光标移动(411.14)

  • Linux下open与fopen的区别
    • https://www.cnblogs.com/hnrainll/archive/2011/09/16/2178706.html
  • FILE/demo19.c
#include <stdio.h>
#include <string.h>

int main(){
	FILE *fp;
	char *str = "cui jia qi.";
	char readBuf[128] = {0};
	//FILE *fopen(const char *path, const char *mode);
	fp = fopen("./cui.txt","w+");//"w+":如果没有则创建这个文件(类似open的O_CREAT)

	//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
	//ptr  buf 缓冲区
	//size  sizeof char  一次写一个char
	// geshu 写多少次char
	// which file 写到哪里
	fwrite(str,sizeof(char),strlen(str),fp);
//	fwrite(str,sizeof(char)*strlen(str),1,fp);//一次写完所有char

	fseek(fp,0,SEEK_SET);//光标定位至头(的0个后面)
	
//	size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
	fread(readBuf,sizeof(char),strlen(str),fp);
	//fread(readBuf,sizeof(char)*strlen(str),1,fp);
	
	printf("read data: %s\n",readBuf);
	fclose(fp);
	return 0;
}

6. 标准C库写入结构体到文件(412.15)

  • FILE/demo21.c(观察nwrite的值和第三个参数有关,而nread取决于真实字节大小)
#include <stdio.h>
#include <string.h>

int main()
{
	//FILE *fopen(const char *path, const char *mode);

	FILE *fp;
	char *str = "chenlichen hen shuai";
	char readBuf[128] = {0};

	fp = fopen("./chen.txt","w+");

	//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
	//ptr  buf
	//size  sizeof char   
	// geshu 
	// which file
	int nwrite = fwrite(str,sizeof(char),100,fp);//nwrite的值取决于第三个参数的值
//	fwrite(str,sizeof(char)*strlen(str),1,fp);
	fseek(fp,0,SEEK_SET);
//	size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
	//int nread = fread(readBuf,sizeof(char),strlen(str),fp);
	int nread = fread(readBuf,sizeof(char)*strlen(str),100,fp);//nread的值跟第三个参数无关,为实际有多少字节
	
	printf("read data: %s\n",readBuf);
	printf("read=%d,write = %d\n",nread,nwrite);
	
	return 0;
}
  • FILE/demo23.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 a;
	char c;
};

int main(){
	FILE *fp;
	
	struct Test data = {100,'a'};
	struct Test data2;

	fp = fopen("./file1","w+");

	int n_write = fwrite(&data,sizeof(struct Test),1,fp);//1次写整个结构体的大小

	fseek(fp,0,SEEK_SET);

	int n_read = fread(&data2,sizeof(struct Test),1,fp);
	
	printf("read %d,%c\n",data2.a,data2.c);
	
	fclose(fp);

	return 0;
}

7. 文件其它函数讲解及文件收尾(413.16)

  • C 库函数 - fgetc()
    • https://www.runoob.com/cprogramming/c-function-fgetc.html
  • FILE/demo24.c
#include <stdio.h>
#include <string.h>

int main(){
	FILE *fp;
	int i;
	char *str = "chenlichen hen shuai o!";
	int len = strlen(str);

	fp = fopen("./test.txt","w+");
	for(i=0;i<len;i++){		

		fputc(*str,fp);      //把str写入fp
		str++;
	}
	
	fclose(fp);
	return 0;
}
  • FILE/demo25.c
#include <stdio.h>
#include <string.h>

int main(){
	FILE *fp;
	int i;
	char c;

	fp = fopen("./test.txt","r");

	while(!feof(fp)){// nonezero if reach end of file//到达文件尾巴时为非0,未到达尾巴时为0
		
		c = fgetc(fp);//把fp里面的字节一个个取出
		printf("%c",c);
	}
	fclose(fp);
	return 0;
}

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

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

相关文章

VSCode 调试 u-boot

文章目录 VSCode 调试 u-boot调试配置启动 u-boot 脚本调试界面重定向之后继续调试参考 VSCode 调试 u-boot 调试配置 参考 qemu基础篇——VSCode 配置 GDB 调试 要想调试 u-boot 只需要再添加一个 u-boot 的配置即可 {"version": "0.2.0","conf…

Python 机器学习入门之K近邻算法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 番外 Python 机器学习入门之K近邻算法 K近邻算法 系列文章目录前言一、K近邻算法简介1、定义2、用途 …

【Unity引擎核心-Object,序列化,资产管理,内存管理】

文章目录 整体介绍Native & Managed Objects什么是序列化序列化用来做什么Editor和运行时序列化的区别脚本序列化针对序列化的使用建议 Unity资产管理导入Asset Process为何要做引擎资源文件导入Main-Assets和 Sub-Assets资产的导入管线Hook&#xff0c;AssetPostprocessor…

对协议的基本认识

目录 前言 TCP网络计算器的模拟实现 制定协议 协议protocol的整体代码 TCP网络计算器的服务端类TcpServer TcpServer类的整体代码 TCP网络计算器的服务端 服务端CalServer.cc的整体代码 TCP网络计算器的客户端 客户端CalClient.cc的整体代码 对模拟实现的TCP网络计算…

匿名内部类的使用:(一看就会!!!)

知识点&#xff1a; 匿名内部类依旧是一个类&#xff0c;但是没有名字&#xff0c;同时还是一个对象&#xff1b;再类的内部&#xff1b; 使用方法指南&#xff1a; 先创建一个类&#xff0c;可以是接口、抽象类、普通父类需要明确声明关系 &#xff0c;父与子、实现接口、抽…

不容易解的题10.15

395.至少有K个重复字符的最长字串 395. 至少有 K 个重复字符的最长子串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/longest-substring-with-at-least-k-repeating-characters/description/?envTypelist&envIdZCa7r67M自认为是不好做的题。尤其…

自动化的采集链接和自动推送必应的在线工具

搜索LMCJL在线工具 进入后点击站长工具类型&#xff0c;选择必应自动推送 进去后&#xff0c;添加域名&#xff0c;点击数据管理&#xff0c;输入必应的token 然后开启推送&#xff0c;就可以实现&#xff0c;自动化采集链接&#xff0c;自动推送给必应。 必应的站长后台官网…

基于吉萨金字塔建造优化的BP神经网络(分类应用) - 附代码

基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于吉萨金字塔建造优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.吉萨金字塔建造优化BP神经网络3.1 BP神经网络参数设置3.2 吉萨金字…

16.SpringBoot前后端分离项目之简要配置一

SpringBoot前后端分离项目之简要配置一 前面对后端所需操作及前端页面进行了了解及操作&#xff0c;这一节开始前后端分离之简要配置 为什么要前后端分离 为了更低成本、更高效率的开发模式。 前端有一个独立的服务器。 后端有一个独立的服务器。两个服务器之间实时数据交换…

关于YOLOv8不显示GFlops的问题解决

屏幕显示GFlops需要安装此pip库: thop。但是没有安装&#xff0c;则不显示&#xff0c;导致debug比较困难。

Linux:进程调度的O(1)算法

文章目录 并发的理解程序运行时的数据进程切换的过程 内核的调度队列和调度原理 并发的理解 前面总结到了&#xff0c;关于并发的概念&#xff0c;并发针对的是单核的CPU上同时运行很多情况&#xff0c;并不是某个程序在CPU上运行就一直运行&#xff0c;而是根据一定的时间片和…

Linux C/C++ 嗅探数据包并显示流量统计信息

嗅探数据包并显示流量统计信息是网络分析中的一种重要技术&#xff0c;常用于网络故障诊断、网络安全监控等方面。具体来说&#xff0c;嗅探器是一种可以捕获网络上传输的数据包&#xff0c;并将其展示给分析人员的软件工具。在嗅探器中&#xff0c;使用pcap库是一种常见的方法…

怎么启动MySQL服务

你可能也遇到这样的问题&#xff0c;打开navicat&#xff0c;但是点击数据库连接不上&#xff0c;这就有可能是数据库服务没有启。报错如下图所示 解决方法一win11为例&#xff0c;右键此电脑&#xff0c;找到管理。 找到服务和应用吃程序&#xff0c;点击服务。 往下找到MySQL…

ti am335 RT-LINUX测试

RT-Linux是一个基于Linux内核的实时操作系统&#xff0c;它在满足Linux操作系统的通用性的同时兼顾 实时性能&#xff0c;它的核心是Linux内核的一个实时扩展&#xff0c;它为实时任务提供了必要的调度机制和时间管理。通过采用抢占式调度策略&#xff0c;高优先级的实时任务可…

肉眼无法读懂是二进制独有的浪漫——一篇博客学懂文件操作(C语言)

目录 一、为什么使用文件 二、什么是文件 2.1程序文件 2.2数据文件 2.3文本文件和二进制文件 2.4文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 3.3文件的顺序读写函数 3.3.1流的概念 3.3.2输入输出的概念 3.3.3函数操作 3.4文件的随机读写函…

miniblink学习

1.基本使用 main.cpp #include "webwidget.h" #include <QApplication> #include "wke.h" //工作目录是指当前目录&#xff0c;运行目录是指exe所在路径。 int main(int argc, char *argv[]) {QApplication a(argc, argv);//设置miniblink的全路径文…

C# GFPGAN 图像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

leetcode-62.不同路径

1. 题目 2. 解答 dp[i][j]表示机器人位于第i&#xff0c;j位置的时候&#xff0c;有多少路径 如果i 0&#xff0c;dp[i][j] 1;如果j 0&#xff0c;dp[i][j] 1;其他情况dp[i][j] dp[i-1][j] dp[i][j - 1] #include <stdio.h>int solve(int m, int n) {int dp[m][…

一场直播脚本的策划及话术怎么写?

一场直播脚本的策划及话术参考 直播流程安排示范:120 分钟直播流程设计(过款型) 标准化直播话术单元(单款产品话术模板) I 直播 120 分钟标准化流程 I 分解为 4 个 30 分钟直播单元 I 30 分钟前期介绍 2-3 个款作为起步 每款持续时长 10 分钟,10 分钟的时间里 ①卖点引出 2 …

找不到msvcp100.dll无法继续执行此代码怎么解决,快速修复dll问题的5个方法

电脑已经成为我们生活和工作中不可或缺的一部分&#xff0c;在我们使用电脑的时候&#xff0c;总会遇到一些技术问题&#xff0c;其中之一就是“找不到msvcp100.dll”。msvcp100.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部…