当前位置: 首页 > news >正文

Linux高级编程 8.13 文件IO

一、文件IO

操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用(unistd.h)  其中有个  文件IO,一般都是对设备文件操作,当然也可以对普通文件进行操作。

这是一个基于Linux内核的没有缓存的IO机制

文件IO特性:
        .1 没有缓冲区
        .2 操作对象不在是流,而是文件描述符
        .3文件描述符
        很小的非负的整数    int   0-1023
        内核每打开一个文件就会获得一个文件描述符
        
          每个程序在启动的时候操作系统默认为其打开
          三个描述符与流对象匹配:
          0 ==>STDIN_FILENO === stdin
          1 ==>STDOUT_FILENO == stdout
          2 ==>STDERR_FILENO == stderr
          stdin,stdout,stderr,===>FILE*(标准IO)

注意:由于0,1,2被这三个描述符占了,所以我们写的文件描述符一般从3开始。

比较标准IO:
        .1标准IO是C库中的,C库相比于系统调用,具有可移植性,也就是可以跨平台
        .2标准IO提供了缓冲机制,例如全缓冲、行缓冲和无缓冲。
        .3标准IO所使用函数,如fopen,fgets,fclose等,文件IO使用open,read,write,close等
        .4标准 I/O 主要处理与标准输入、输出和标准错误相关的流。文件 I/O 可以处理各种文件,包括普通文件、设备文件等。

二、相关函数

1.open

int open(const char *pathname, int flags,int mode);
        功能:获得一个文件描述符
        参数:
            pathname:文件名
            flags:
                O_RDONLY    只读
                O_WRONLY   只写
                O_RDWR       读写
                O_CREAT       创建文件 
                O_TRUNC      文件内容清空
                O_APPEND    追加

fopen与open对比
w                 O_WRONLY|O_CREAT|O_TRUNC
w+               O_RDWR|O_CREAT|O_TRUNC
r                   O_RDONLY
r+                 O_RDWR
a                  O_WRONLY|O_CREAT|O_APPEND
a+                O_RDWR|O_CREAT|O_APPEND

        返回值:
            成功返回文件描述符
            失败返回-1

eg:open("1.c",O_WRONLY|O_CREAT|O_TRUNC,0666 );

最后的0666是权限,与O_CREAT相对应,有创建就需要设置权限

注意:0666的前导零是不能省略的,这标志着0666是八进制,同时在创建目录和文件时,系统会与默认的umask(0002)相减,以便控制新建目标和文件有合理的权限。一般新建文件设置权限为0666,新建目录设置权限为0777;由于与umask相减,所以查看时,文件的权限会变成664(rw-rw-r--),目录权限会变成775(rwx rwx r-x)

2.write

ssize_t write(int fd,  const  void *buf, size_t count);
        功能:通过文件描述符向文件中写一串数据
        参数:
            fd:文件描述符
            buf:要写入文件的字符串的首地址
            count:要写入字符串的实际长度

eg:

char buf[512]="hello";

write(fd,buf,strlen(buf));

注意:在write函数中count应该写buf里的字符串实际有效长度,这里使用了strlen计算字符串的长度,不能用sizeof(buf),因为sizeof计算出来的是所占空间的大小,是512字节,但是hello只有5字节,剩下的五百多字节就会补'\0',但文本文件中是不能有'\0'的。

        返回值:
            成功返回实际写入的个数
            失败返回-1

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>int main(int argc, const char *argv[])
{int fd=open("open.txt",O_WRONLY | O_CREAT | O_TRUNC,0666);if(fd==-1){fprintf(stderr,"open error\n");return 1;}printf("fd is %d\n",fd);//打印文件描述符char buf[512]="bullish of shit";int ret=write(fd,buf,strlen(buf));if(ret==-1){fprintf(stderr,"write error\n");return 1;}close(fd);return 0;
}

3.read

ssize_t read(int fd, void *buf, size_t count);
        功能:通过文件描述符读取文件中的数据
        参数:
            fd:文件描述符
            buf:存放数据空间的首地址
            count:要读到数据的个数

注意:在read函数中count的值可以比实际的有效长度长,可以使用sizeof(buf)。     

        返回值:
            成功返回读到数据的个数
            失败返回-1
            读到文件结尾返回0

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, const char *argv[])
{int fd=open("open.txt",O_RDONLY);if(fd==-1){fprintf(stderr,"open error\n");return 1;}printf("fd is %d\n",fd);char buf[512]={0};while(1){int ret=read(fd,buf,sizeof(buf));if(ret<=0){break;}printf("%s\n",buf);}close(fd);return 0;
}

4.lseek

off_t lseek(int fd, off_t offset, int whence);
        功能:定位光标的位置
        参数:
            fd:文件描述符
            offset:偏移量
                        正:向后偏移
                        负:向前偏移
                        零:不偏移
            whence:
                SEEK_SET
                SEEK_CUR
                SEEK_END
        返回值:
            成功返回偏移量,从文件开头开始,以字节为单位测量?
            失败返回-1

通过lseek可以求文件大小

off_t off=lseek(fd,0,SEEK_END);

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>int main(int argc, char *argv[])
{int fd = open("backup.c",O_RDWR);    if(-1 == fd){fprintf(stderr,"open error\n");return 1;}off_t off = lseek(fd,15,SEEK_SET);printf("off %ld\n",off);char buf[]="hello";write(fd,buf,strlen(buf));printf("fd is %d\n",fd);close(fd);return 0;
}

5.fileno

int fileno(FILE *stream);
功能:
    获得一个文件流指针中的文件描述符
    可以认为是将文件流变为文件描述符  FILE* fp -> int fd
参数:
    stream:文件流指针
返回值:
    成功返回文件描述符
    失败返回-1

#include <stdio.h>
#include <unistd.h>int main(int argc, const char *argv[])
{FILE * fp=fopen("1.txt","r");int fd=fileno(fp);if(-1==fd){fprintf(stderr,"flieno error\n");return 1;}char buf[512]={0};read(fd,buf,sizeof(buf));printf("%s\n",buf);fclose(fp);return 0;
}

6.fdopen

 FILE *fdopen(int fd, const char *mode);
 功能:
    将文件描述符转化为文件流指针  int fd -> FILE *fp
 参数:
    fd:已经打开的文件描述符
    mode:  "r"
                "r+"
                "w"
                "w+"
                "a"
                "a+"

注意:原来的权限是O_RDONLY,对应"r",不能修改     

 返回值:
    成功返回文件流指针
    失败返回NULL 

注意:fileno和fdopen使用封装度高的关闭文件,即fclose(); 

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main(int argc, const char *argv[])
{int fd=open("1.txt",O_RDONLY);FILE *fp=fdopen(fd,"r");if(NULL==fp){fprintf(stderr,"fdopen error\n");}char buf[512]={0};fgets(buf,sizeof(buf),fp);printf("%s",buf);fclose(fp);return 0;
}

三、重点

open、read、write

使用read、write函数实现文件复制

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>int main(int argc, const char *argv[])
{if(argc<3){fprintf(stderr,"usage:./a.out srcfile destfile\n");return 1;}int src=open(argv[1],O_RDONLY);int dest=open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0666);if(src==-1 || dest==-1){fprintf(stderr,"open error\n");return 1;}printf("src is %d\n",src);printf("dest is %d\n",dest);while(1){char buf[512]={0};int ret=read(src,buf,sizeof(buf));if(ret<=0){break;}write(dest,buf,ret);}close(src);close(dest);return 0;
}

相关文章:

Linux高级编程 8.13 文件IO

一、文件IO 操作系统为了方便用户使用系统功能而对外提供的一组系统函数。称之为 系统调用&#xff08;unistd.h&#xff09; 其中有个 文件IO&#xff0c;一般都是对设备文件操作,当然也可以对普通文件进行操作。 这是一个基于Linux内核的没有缓存的IO机制 文件IO特性&…...

【k8s】ubuntu18.04 containerd 手动从1.7.15 换为1.7.20

ubutnu18.04之前手动安装了1.7.15现在下载1.7.20containerd-1.7.20-linux-amd64.tar.gz root@k8s-worker-i58265u:/home/zhangbin# root@k8s-worker-i58265u:/home/zhangbin# https://github.com/containerd/containerd/releases/download/v1.7.20/containerd-1.7.20-linux-am…...

常用浮动方式

目录 一、标准流 二、float浮动 三、 flex浮动 3.1flex组成 3.2 主轴对齐方式 3.3侧轴对齐方式 3.4修改主轴方向 3.5弹性盒子换行 3.6行对齐方式 一、标准流 标签在网页中的默认排布规则 例如&#xff1a; 块元素独占一行、行内元素可以一行显示多个 二、float浮动 让块…...

设计模式反模式:UML常见误用案例分析

文章目录 设计模式反模式&#xff1a;UML常见误用案例分析1. 反模式概述2. 反模式的 UML 图示误用2.1 God Object 反模式2.2 Spaghetti Code 反模式2.3 Golden Hammer 反模式2.4 Poltergeist 反模式 3. 总结 设计模式反模式&#xff1a;UML常见误用案例分析 在软件工程领域&am…...

Python编码系列—Python SQL与NoSQL数据库交互:深入探索与实战应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…...

贪心算法---跳跃游戏

题目&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 思路…...

利用EditPlus进行Json数据格式化

利用EditPlus进行Json数据格式化 git下载地址&#xff1a;https://github.com/michael-deve/CommonData-EditPlusTools.git (安装过editplus的直接将里面的json.js文件复制走就行) 命令&#xff1a;Cscript.exe /nologo “D:\Program Files (x86)\EditPlus 3\json.js” D:\P…...

xss.function靶场(easy)

文章目录 第一关Ma Spaghet!第二关Jefff第三关Ugandan Knuckles第四关Ricardo Milos第五关Ah Thats Hawt第六关Ligma第七关Mafia第八关Ok, Boomer 网址&#xff1a;https://xss.pwnfunction.com/ 第一关Ma Spaghet! 源码 <!-- Challenge --> <h2 id"spaghet&qu…...

【LLM入门】Let‘s reproduce GPT-2 (124M)【完结,重新回顾一下,伟大!】

文章目录 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-3 repro03:56:21 shoutout to llm.c, equivalent but faster code in raw C/CUDA【太牛了ba】03:59:39 summary, phew, build-nanogpt github repo 03:43:05 SECTION 4: results in the morning! GPT-2, GPT-…...

c语言----取反用什么符号

目录 前言 一、逻辑取反 二、按位取反 三、应用场景 前言 在C编程语言中&#xff0c;取反使用符号!表示逻辑取反&#xff0c;而使用~表示按位取反。 其中&#xff0c;逻辑取反!是将表达式的真值&#xff08;非0值&#xff09;转换为假&#xff08;0&#xff09;&#xff0c…...

【html+css 绚丽Loading】 - 000003 乾坤阴阳轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享htmlcss 绚丽Loading&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495…...

【Web】巅峰极客2024 部分题解

目录 EncirclingGame GoldenHornKing php_online admin_Test EncirclingGame 玩赢游戏就行 GoldenHornKing 利用点在传入的app 可以打python内存马 /calc?calc_reqconfig.__init__.__globals__[__builtins__][exec](app.add_api_route("/flag",lambda:__i…...

在AMD GPU上进行Grok-1模型的推理

Inferencing with Grok-1 on AMD GPUs — ROCm Blogs 我们展示了如何通过利用ROCm软件平台&#xff0c;能在AMD MI300X GPU加速器上无缝运行xAI公司的Grok-1模型。 介绍 xAI公司在2023年11月发布了Grok-1模型&#xff0c;允许任何人使用、实验和基于它构建。Grok-1的不同之处…...

在亚马逊云科技上部署开源大模型并利用RAG和LangChain开发生成式AI应用

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上利用Sag…...

Spring——Bean的生命周期

Bean的生命周期牵扯到Bean的实例化、属性赋值、初始化、销毁 其中Bean的实例化有四种方法、构造器实例化、静态工厂、实例工厂、实现FactoryBean接口 对于Bean的生命周期我们可以在Bean初始化之后、销毁之前对Bean进行控制 两种方法&#xff1a; 一、配置 1、在Bean的对象…...

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…...

网络性能优化:从问题诊断到解决方案

网络性能优化是确保网络高效、稳定运行的关键过程&#xff0c;它通过改进网络设备、协议和配置&#xff0c;以提高网络吞吐量、降低延迟并提升用户体验。在网络性能优化的全过程中&#xff0c;从问题诊断到解决方案的实施&#xff0c;需要经过一系列详细的步骤和策略。本文将从…...

深度学习10--强化学习

强化学习(增强学习、再励学习、评价学习简称RL)是近年来机器学习领域最热门的方向之一&#xff0c;是实现通用人工智能的重要方法之一。本章将通俗易懂地讲一下强化学习中的两个重要的模型DQN 和DDPG。 马尔可夫决策过程(Markov Decison Process,MDP)包括两个对象&#xff…...

SSA-SVM多变量回归预测|樽海鞘群优化算法-支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&a…...

KEEPALIVED高可用集群知识大全

目录 一、KEEPALIVED高可用集群简介 1、Keepalived 高可用集群的工作原理 2、Keepalived 高可用集群的作用 二、KEEPALIVED部署 1、网络配置 2、软件安装与启动 3、配置虚拟路由器 4、效果实现 三、启用keepalived日志功能 四、KEEPALIVED的几种工作模式 1、KEEPALI…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...