Linux—文件编程

如何用代码操作文件,实现文件的创建,打开,编辑等自动化执行?
操作系统提供了一系列的API。
如Linux系统:
打开:open
读写:write/read
光标定位:lseek
关闭:close

打开/创建文件:

SYNOPSIS
//头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int open(const char *pathname, int flags);//指针指向文件路径,int 权限
int open(const char *pathname, int flags, mode_t mode);//
/*pathname:要打开的文件名(含路径,缺省为当前路径)
Flags:
O_RDONLY只读打开  O_WRONLY只写打开  O_RDWR 可读可写打开
(文件不存在,返回值为-1)O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该文件的存取许可权限
O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错:打开文件失败或者返回值为-1。
O_APPEND:每次写时都加到文件尾端,j如不加O_APPEND则覆盖之前的内容。
O_TRUNC:属性去打开文件时,如果文件本来是有内容的,而且为只读或只写成功打开,则其长度截短为0,把之前内容全部删除,重新写入.Mode:一定是在flagse中使用了O_CREAT标准,mode记录待创建的文件的访问权限*/
int creat(const char *pathname, mode_t mode);DESCRIPTION//描述
Given a pathname for a file, open() returns a file descriptor,a small,nonnegative integer for use in subsequent system calls (read(2),write(2),lseek(2),fcntl(2),etc.),The file descriptor returned by a successful call will be the lowestnumbered file descriptor not currently open for the process.
/*给定一个文件的路径名,open() 返回一个文件描述符,一个小的非负整数,用于后续的系统调用(read(2)、write(2)、lseek(2)、fcntl(2)等),成功调用返回的文件描述符将是当前未为进程打开的最低编号文件描述符。
*/

例:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main()
{int fd;fd = open("./file1",O_RDWR);if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//0600可读写权限(4+2)/*权限:					宏表示可读:r			4		S_IRUSR可写:w			2		S_IWUSR执行:x			1		S_IXUSR可读,写,执行		7		S_IRWXU*/if(fd > 0){printf("create file1 success!\n");}}return 0;
}

文件的写入:

#include <unistd.h>ssize_t write(int fd,const void *buf,size_t count);
//fd文件描述符,缓冲区指针,大小(count字节)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int fd;char *buf = "laowang hao bang!";fd = open("./file1",O_RDWR);//打开文件file1if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//0600可读写权限(4+2)/*权限:可读:r		4可写:w		2执行:x		1*/if(fd > 0){printf("create file1 success!\n");}}printf("open success:fd = %f\n",fd);write(fd,buf,sizeof(buf));//sizeof分配8个字节给bufwrite(fd,buf,strlen(buf));//全部显示close(fd);return 0;
}

文件读取:

#include <unistd.h>ssize_t read (int fd,const void *buf,size_t count);
//fd文件描述符,缓冲区指针,大小(count字节)

> 光标重新定位:

#include <sys/types.h>
#include <unistd.h>

off_t lseek (int fd,off_t offset,int whence);
fd文件描述符,偏移值,位置
(seek_set,指向文件的头)
(seek_end,指向文件的尾)
(seek_cur,指向文件光标当前位置)

#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;char *buf = "laowang hao bang!";fd = open("./file1",O_RDWR);//打开文件file1if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//0600可读写权限(4+2)/*权限:可读:r		4可写:w		2执行:x		1*/if(fd > 0){printf("create file1 success!\n");}}printf("open success:fd = %f\n",fd);int n_write = write(fd,buf,sizeof(buf));//sizeof分配8个字节给bufint n_write =write(fd,buf,strlen(buf));//全部显示if(n_write != -1){printf("write %d byte to file\n",n_write);}//因为光标问题,需要重新打开文件才能读取。或者把光标重新定位//close(fd);//fd = open("./file1",O_RDWR);//重新打开文件file1char *readBuf;readBuf = (char *)malloc(sizeof(char)*n_write + 1);//char的大小*文件大小+1lseek(fd,0,SEEK_SET);//光标重新定位int n_read = read(fd,readBuf,n_write);printf("read %d ,context:%s\n",n_read,readBuf);close(fd);return 0;
}

文件描述符 = open(文件,--------)是一个非负整数

Linux系统中有默认的文件描述符:
0 标准输入 STDIN_FILENO
1 标准输出 STDOUT_FILENO
2 标准错误 STDERR_FILENO

文件有静态文件和动态文件
动态文件 = open 静态文件 后在Linux内核产生一个结构体

fd
信息节点
buf(内容)相当于内存

用close之后存入磁盘静态文件

练习1:实现Linux cp命令的代码
参数argc:
参数0 参数1 参数2
cp 源文件(src) 目标文件(des)
argv[0] argv[1] argv[2]

思路:
1.打开源文件
2.读源文件到buf
3.打开/创建目标文件
4.将buf写入到目标文件
5.close两个文件

编译:gcc 文件 -o mycp
./mycp 源文件 目标文件

#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,fdDes;char readBuf[1024] = {0};if(argc != 3){printf("pararm error\n");exit(-1);}fdSrc = open(argv[1],O_RDWR);//打开文件int n_read = read(fdSrc,readBuf,1024);fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);int n_write =write(fdDes,readBuf,strlen(readBuf));close(fdSrc);close(fdDes);return 0;
}

练习2:实现配置文件的修改
man strstr//查询strstr用法

如:
读取出来为:
SPEED = 3
LENG = 3
SCORE = 9
LEVEL = 5
修改为:
SPEED = 5
LENG = 100
SCORE = 90
LEVEL = 95

思路:
1.找到修改位置的行
2.在该行中找到需要修改的位置
3.修改该位置

#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,fdDes;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);lseek(fdSrc,0,SEEK_SET);readBuf = (char *)malloc(sizeof(char)*size + 8);int n_read = read(fdSrc,readBuf,1024);char *p = strstr(readBuf,"LENG=");if(p==NULL){printf("not founf\n");exit(-1);}p = p+strlen("LENG=");*p = "100";lseek(fdSrc,0,SEEK_SET);//移动光标int n_write =write(fdSrc,readBuf,strlen(readBuf));close(fdSrc);return 0;
}

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

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

相关文章

华为Mate60低调发布,你所不知道的高调真相?

华为Mate60 pro 这两天的劲爆新闻想必各位早已知晓&#xff0c;那就是华为Mate60真的来了&#xff01;&#xff01;&#xff01;并且此款手机搭载了最新国产麒麟9000s芯片&#xff0c;该芯片重新定义了手机性能的巅峰。不仅在Geekbench测试中表现出色&#xff0c;还在实际应用…

Tiny Player Mac:小而美,音乐播放的极致体验

对于追求音质和操作简便的Mac用户来说&#xff0c;Tiny Player Mac是一款不可多得的音乐播放器。它以简洁的界面、强大的功能和优异的性能&#xff0c;吸引了无数用户的目光。接下来&#xff0c;让我们一起了解这款小而美的音乐播放器。 Tiny Player Mac支持多种音频格式&#…

机器学习:异常检测

问题定义 anomaly&#xff0c;outlier&#xff0c; novelty&#xff0c; exceptions 不同的方法使用不同的名词定义这类问题。 应用 二分类 假如只有正常的数据&#xff0c;而异常的数据的范围非常广的话&#xff08;无法穷举&#xff09;&#xff0c;二分类这些不好做。另外就…

Linux之基于HTTPS的静态网站

目录 Linux之基于HTTPS的静态网站 定义 SSL协议 使用Apachemod_ssl组件的加密认证网站 mod_ssl模组 安装 配置文件 ssl配置文件的主要参数 案例 案例1 --- 搭建HTTPSSL的加密认证的web服务器 案例2 --- 组建多个子目录的网站www.joker.com&#xff0c;该网站下有2个子…

java八股文面试[JVM]——GC优化方案

线上YGC耗时过长优化方案有哪些&#xff1f; 1. 如果生命周期过长的对象越来越多&#xff08;比如全局变量或者静态变量等&#xff09;&#xff0c;会导致标注和复制过程的耗时增加 2. 对存活对象标注时间过长&#xff1a;比如重载了Object类的Finalize方法&#xff0c;导致标…

Kind创建本地环境安装Ingress

目录 1.K8s什么要使用Ingress 2.在本地K8s集群安装Nginx Ingress controller 2.1.使用Kind创建本地集群 2.1.1.创建kind配置文件 2.1.2.执行创建命令 2.2.找到和当前k8s版本匹配的Ingress版本 2.2.1.查看当前的K8s版本 2.2.2.在官网中找到对应的合适版本 2.3.按照版本安…

适配器、装饰器模式

一、装饰器模式 向一个现有的对象增加其功能而不改变其结构&#xff0c;属于类的包装

01. Kubernetes基础入门

目录 1、前言 2、Kubernetes介绍 2.1、什么是Kubernetes 2.2、主要功能 2.3、与Docker的关系 2.4、Kubernetes集群架构体系 3、Kubernetes组件 3.1、核心组件 3.2、附加组件 4、Kubernetes对象 4.1、对象管理 4.2、命名空间 4.3、标签 1、前言 Docker 容器技术将…

JavaWeb之Cookie的简单使用!!!

什么是Cookie Cookie:客户端会话技术&#xff0c;将数据保存到客户端&#xff0c;以后每次请求都携带Cookie数据进行访问 Cookie 数据存放在浏览器端(客户端) 创建Cookie 1.创建Cookie Cookie cookie new Cookie("key","value"); 2.使用response响应…

uniapp实现微信小程序全局可分享功能

uniapp实现微信小程序全局【发送给朋友】、【分享到朋友圈】、【复制链接】 主要使用 Vue.js 的 全局混入 1.创建一个全局分享的js文件。示例文件路径为&#xff1a;./utils/shareWx.js &#xff0c;在该文件中定义全局分享的内容&#xff1a; export default {data() {retur…

【广州华锐互动】智能变电站AR仿真实训系统大大提高培训的效率和质量

随着电力行业的不断发展&#xff0c;变电站的建设和运维变得越来越重要。传统的变电站运维培训方式存在着诸多问题&#xff0c;如难以真实模拟变电站运行环境、信息传递不及时、难以掌握实际操作技能等问题。而智能变电站AR仿真实训系统可以为变电站运维人员带来全新的培训方式…

leetcode做题笔记126. 单词接龙 II

按字典 wordList 完成从单词 beginWord 到单词 endWord 转化&#xff0c;一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -> s2 -> ... -> sk 这样的单词序列&#xff0c;并满足&#xff1a; 每对相邻的单词之间仅有单个字母不同。转换过程中的每个单词 s…

vue里el-form+el-table实现验证规则的写法

vue里el-formel-table实现验证规则的写法 vue里el-formel-table实现验证规则的写法 vue里el-formel-table实现验证规则的写法 重点是因为使用el-form el-table与单独使用el-form时数据不同&#xff0c;前者是对象json数组&#xff0c;后者是对象&#xff0c;导致了el-form-ite…

WebSocket与SSE区别

一&#xff0c;websocket WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09; 它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 Websocket是一个持久化的协议 websocket的原理 …

ceph架构及 IO流程

CEPH是由多个节点构成的集群&#xff0c;它具有良好的可扩展性和可靠性。节点之间相互通信以达到&#xff1a; 存储和检索数据 数据复制 监控集群的健康状况 保证数据的完整性 检测故障并恢复 基本架构如下图&#xff1a; 分布式对象存储系统RADOS是CEPH最为关键的技术&a…

20.添加HTTP模块

添加一个简单的静态HTTP。 这里默认读者是熟悉http协议的。 来看看http请求Request的例子 客户端发送一个HTTP请求到服务器的请求消息&#xff0c;其包括&#xff1a;请求行、请求头部、空行、请求数据。 HTTP之响应消息Response 服务器接收并处理客户端发过来的请求后会返…

QT之QWebEngineUrlRequestInterceptor

QWebEngineUrlRequestInterceptor用来拦截网络请求&#xff0c;例如如果需要查看网页中发生了哪些get/post请求。 QWebEngineUrlRequestInterceptor是一个抽象类&#xff0c;意味着需要子类化它才能得到所需的内容&#xff0c;使用方法如下&#xff1a; 头文件&#xff1a; c…

android studio 的 adb配置

首先在 Android Studio 中 打开 File -> Settings: 下载 “Google USB Driver” 这个插件 (真机调试的时候要用到), 并且记一下上面的SDK路径: 右键桌面上的 “我的电脑”, 点击 “高级系统设置”, 配置计算机的高级属性, 有两步: 添加一个新的环境变量 ANDROID_HOME, 变量…

一、Java基础面试题

Java Se Java语言有哪些特点&#xff1f; 简单易学&#xff1b;面向对象(封装、继承、多态);平台无关性支持多线程可靠性(具备异常处理和自动内存管理机制) JVM 、JDK 、JRE三者之间的关系&#xff1f; JDK(Java Develoment Kit): 是Java开发工具包&#xff0c;是整个Java的核…

17 | Spark中的map、flatMap、mapToPair mapvalues 的区别

在Apache Spark中,map、flatMap、mapToPair和mapValues是用于对RDD(Resilient Distributed Dataset)进行转换的不同操作。这些操作可以用来处理分布式数据集中的元素,但它们的用途和行为略有不同。 以下是它们的主要区别以及相应的Java代码示例: map:map操作用于对RDD中…