LINUX---文件

news2024/11/18 21:52:56

目录

  • 第一部分:文件编程
      • 一.打开/创建文件
      • 二.文件的写入操作
      • 三.文件的读取
      • 四.文件的光标
          • 应用:计算文件的大小
  • 第二部分:文件操作原理:
      • 一.文件描述符
      • 静态文件和动态文件
  • 第三部分:文件编程小应用
      • 1.实现CP命令
      • 2.修改文件
      • 3.写一个整数到文件
      • 4.写一个结构体到文件
  • 第四部分 标准C库对文件的操作
      • 1.open和fopen的区别:
      • 2.应用:
        • 补充: 对参数的理解:
        • 标准C库写一个结构体到文件
          • 这里有一个问题:
        • fputc (用的少)
        • feop fgetc (用的少)

linux是通过编程来实现对文件的一系列操作
(创建文档 编辑文档 保存文档 关闭文档)

第一部分:文件编程

一.打开/创建文件

1.open函数

头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型(2个):
int open(const char *pathname, int flags);
参数1:指向文件路径的字符串
参数2:权限:
             O_RDONLY 只读打开 (用这个后续就不能write了)
             O_WRONLY  只写打
             O_RDWR   可读可写打开

int open(const char *pathname, int flags,mode_t mode);
参数3:也是权限。例如:0600
0600(可读可写)的解释:
可读    r    4
可写    d    2
可执行  x    1       0600   4+2=6

open一个文件时会返回一个文件描述符

在这里插入图片描述
在这里插入图片描述

2.creat(要创建的文件名,创建模式)
  创建模式:
  S_IRUSR 可读       宏:4
S_IWUSR	可写         宏:2
S_IXUSR	可执行       宏:1
S_IRWXU	 可读可写可执行             宏:7  

在这里插入图片描述
在/home/jmh/路径下创建一个file1
在这里插入图片描述

3.权限:
O_EXCL:若已经有该文件,还创建,则返回-1
O_CREAT:往文件尾部加东西
O_TRUNC:把之前所有的都清空,写上后加的东西

二.文件的写入操作

write(fd,buf要写的东西,东西的大小)
这个buf是个无类型的指针,使用时要注意强制转换
返回值是成功写入的字节数
头文件:#include <unisted.h>

在这里插入图片描述

三.文件的读取

头文件同write
read(fd,读到哪里,要读内容的大小)
返回值是成功读到的字节数

在这里插入图片描述
nread是读到的大小 readbuf是读到的内容

四.文件的光标

lseek (fd,偏移值,位置)
位置有三种:
SEEK_SET 头
SEEK_END尾
SEEK_CUR当前位置(负数往前走,正数往后走)

应用:计算文件的大小

在这里插入图片描述

第二部分:文件操作原理:

一.文件描述符

1.linux中,默认存在012这三个文件描述符
0:标准输入
1:标准输出
2:标准错误

例如:
read(0,buf,5)从标准输入那里去读,读到buf里
write (1,buf,5)    把buf写到标准输出里去

在这里插入图片描述
在这里插入图片描述

静态文件和动态文件

文件存在磁盘中,磁盘中的文件是静态文件。
open静态文件后,会在linux内核产生一个结构体来记录这个文件(此时是动态文件),read write操作都是对这里的文件进行操作。

第三部分:文件编程小应用

1.实现CP命令

实现cp src.c des.c

思路:
打开src.c
读src到buf
打开/创建des.c
把buf写到des.c
close两个文件

在这里插入图片描述
优化1:
0600前的权限那里可以加个O_TRUNC(如果目标文件有内容,则删掉,写新的)。
优化2:
1024那里,可以写成readbuf的大小,1024个字节不够准确,容易拷贝少了
在这里插入图片描述
解释:
(int argc char **argv)
argc:参数个数
**argv:数组指针,每一项都是个数组
在这里插入图片描述
注意:编译时,后面要加上 -o mycp

2.修改文件

test.config文件里:把LENG=3改成LENG=5
在这里插入图片描述


编译:在这里插入图片描述

3.写一个整数到文件

在这里插入图片描述

4.写一个结构体到文件

在这里插入图片描述

第四部分 标准C库对文件的操作

1.open和fopen的区别:

1.来源
open是UNIX(包括linux)系统下的
fopen是C语言的库函数(就是只要是用的C语言,就有这个库)
2.移植性
fopen有良好的移植性,而open是UNIX系统调用,移植性有限(windows下不能运行)。
3.适用范围
某些特定情况下必须用open,fopen用来操作普通文件,比如之前写的open read write 都可以替代成fopen fread fwrite.
4.文件IO层次
open是低级IO fopen是高级IO
5.缓冲
缓冲文件系统:
fopen是在缓冲区中完成的,最终一次性写入到文件,内存到外存切换的次数就少,执行速度快,效率高
非缓冲文件系统:
open通过内核来操作文件,读写时会从用户态到内核态进行切换,多次调用就会导致效率很低。
open没缓冲,fopen有缓冲

2.应用:

FILE *fopen(文件路径,权限)
他的返回值是文件流,不同于open返回的文件描述符
权限:
r
r+
w
w+  如果没有就创建
a
a+
size_t fwrite(缓冲区buf,数据类型的大小,数据的个数,文件指针)
size_t fread(缓冲区buf,数据类型的大小,数据的个数,文件指针)

在这里插入图片描述
优化:
fread和fwrite可以这么写:
(str , sizeof(char)*strlen(str) , 1 , fp); 一次就写(读)完那么多

补充: 对参数的理解:

read和write的返回值是成功读/写到的字节数。
而fread和fwrite的返回值受第三个参数影响。
但如果写了1个字节,读100,实际读的返回值也是1。
但写多少,实际写的返回值就是多少

标准C库写一个结构体到文件

在这里插入图片描述

这里有一个问题:
fwrite和fread第三个参数如果都写1,就没问题。
都写2 就会报下图的错。
不知道为什么,也不深究了,因为一般来说正常写都写1。

在这里插入图片描述
暂时的理解:读的时候,因为结构体里有int 有char 不知道是读int还是读char,不好分开读,就一次性把结构体读出来,所以读的第三个参数就填1

fputc (用的少)

输入数据(整型,字符,字符串…)到文件里
在这里插入图片描述

feop fgetc (用的少)

feop:
判断是否到了文件尾部。
没到尾部,返回值0
到尾部,返回值非0

fgetc:
一个一个字符的从文件里取出来
在这里插入图片描述

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

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

相关文章

安卓玩机搞机技巧综合资源-----修改rom 制作rom 解包rom的一些问题解析【二十一】

接上篇 安卓玩机搞机技巧综合资源------如何提取手机分区 小米机型代码分享等等 【一】 安卓玩机搞机技巧综合资源------开机英文提示解决dm-verity corruption your device is corrupt. 设备内部报错 AB分区等等【二】 安卓玩机搞机技巧综合资源------EROFS分区格式 小米红…

【Vue笔记】Vue组件的创建、使用以及父子组件数据通信常见的几种方式

这篇文章&#xff0c;主要介绍Vue组件的创建、使用以及父子组件数据通信常见的几种方式。 目录 一、Vue组件的使用 1.1、局部组件 1.2、全局组件 1.3、动态组件&#xff08;组件动态切换&#xff09; 1.4、缓存组件 &#xff08;1&#xff09;如何缓存组件 &#xff08;…

微服务技术--Nacos与Eureka

eureka注册中心 远程调用的问题 消费者该如何获取服务提供者具体信息&#xff1f; 服务提供者启动时向eureka注册自己的信息eureka保存这些信息消费者根据服务名称向eureka拉取提供者信息 如果有多个服务提供者&#xff0c;消费者该如何选择&#xff1f; 服务消费者利用负载均…

区块链技术1---密码学基础

摘要&#xff1a;BTC属于加密货币&#xff0c;其中必然涉及到密码学的知识&#xff0c;而比特币比较开放&#xff0c;交易记录&#xff0c;交易金额甚至是底层源代码都是对外开放&#xff0c;那么加密使用在何处&#xff1f;这里就来谈一谈1&#xff1a;哈希哈希函数是密码学的…

client-go实战之六:时隔两年,刷新版本继续实战

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 系列文章链接 client-go实战之一&#xff1a;准备工作client-go实战之二:RESTClientclient-go实战之三&#xff1a;Clientsetclient-go实战之四&#xff1a;…

JavaWeb开发(三)3.3——Spring Bean详解

一、Bean的概念 由 Spring IoC 容器负责创建、管理所有的Java对象&#xff0c;这些管理的对象称为 Bean&#xff0c;Bean 根据 Spring 配置文件中的信息创建。 二、基于XML方式管理bean对象 eg&#xff1a; <?xml version"1.0" encoding"UTF-8"?&…

【B-树、B+树、B* 树】多叉平衡搜索树,解决“IO次数”与“树高”问题~

目录 一、为什么会出现B-树&#xff1f; 面试题&#xff1a; 二、什么是B-树&#xff1f; 2.1、B,B-树,B*树 导航 三、B-树的模拟实现 3.1、插入结点分析 3.1.1、根节点的分裂 3.1.2、继续插入数据&#xff0c;分裂子节点 3.2.3、再次插入数据&#xff0c;导致根节点继…

tomcat和apache有什么区别?如何将内网发布到互联网访问?

tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的&#xff0c;我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联…

Android原生检测Selinux的三种方法

本文介绍 3 种检测 Android 设备 SELinux 状态的方法, Java 层检测Selinux已经没有太多意义,因为不是很靠谱,随便一个hook代码就能绕过,所以我要告诉你如何在 C 层完成检测。这几种方法在效率和抵抗mock SELinux State 的技术方面都不相同,因此在使用之前你需要知道每种方…

Windows server——部署DNS服务

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 本章重点 一.DNS概述 1.DNS的诞生 二.DNS的功能 使用域名访问具有以下优点…

【大厂高频真题100题】《二叉树的序列化与反序列化》 真题练习第23题 持续更新~

二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限…

c语言 图形化贪吃蛇 多种功能 无需安装第三方库 课设 (附代码)

前言 类贪吃蛇是利用c语言模仿并实现经典游戏贪吃蛇&#xff0c;使其在窗口有贪吃蛇活动的规定范围&#xff0c;并完成一系列包括但不限于模仿蛇的移动&#xff0c;方向控制&#xff0c;吃到食物加分&#xff0c;撞上墙壁及蛇头碰到蛇身死亡等游戏功能。 附加功能&#xff1a…

软件测试复习03:动态测试——白盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录逻辑覆盖法&#xff1a;最常用程序插桩技术基本路径法点覆盖边覆盖边对覆盖主路径覆盖符号测试错误…

前端leaflet框选下载bing遥感图

微软必应bing遥感图。bing地图比百度遥感图清晰很多&#xff0c;19级&#xff0c;百度是18级&#xff0c;同样的18级&#xff0c;bing地图比百度也清晰很多。所以没有必要用百度地图了。不过bing地图仅用于学习&#xff0c;商用要付费。参考了https://xiaozhuanlan.com/topic/6…

CV+Deep Learning——网络架构Pytorch复现系列——Detection(二:RtinaNet)更换backbones

上一话 CVDeep Learning——网络架构Pytorch复现系列——Detection(一&#xff1a;SSD:Single Shot MultiBox Detector 4.推理Detect)https://blog.csdn.net/XiaoyYidiaodiao/article/details/128683973?spm1001.2014.3001.5501 复现Object Detection&#xff0c;会复现的网络…

设计模式-门面模式

医院的例子 现代的软件系统都是比较复杂的&#xff0c;设计师处理复杂系统的一个常见方法便是将其"分而治之"&#xff0c;把一个系统划分为几个较小的子系统。如果把医院作为一个子系统&#xff0c;按照部门职能&#xff0c;这个系统可以划分为挂号、门诊、划价、化…

Web--Jedis

# Redis 1. 概念&#xff1a; redis是一款高性能的NOSQL系列的非关系型数据库 1.1.什么是NOSQL NoSQL(NoSQL Not Only SQL)&#xff0c;意即“不仅仅是SQL”&#xff0c;是一项全新的数据库理念&#xff0c;泛指非关系型的数据库。 随着互联网web2.0网…

Arch Linux 来报道!!!

导读Ubuntu 的制造商 Canonical 早已和微软进行合作&#xff0c;让我们体验了极具争议的 Bash on Windows。外界对此也是褒贬不一&#xff0c;许多 Linux 重度用户则是质疑其是否有用&#xff0c;以及更进一步认为 Bash on Windows 是一个安全隐患。 Unix 的 Bash 是通过 WSL (…

LabVIEW使用VI脚本创建和打开VI

LabVIEW使用VI脚本创建和打开VI按照下列步骤&#xff0c;可以创建一个VI&#xff0c;该VI使用VI脚本创建和打开VI。创建VI前&#xff0c;需先了解VI脚本的基本内容。必须启用VI脚本&#xff0c;才能显示VI脚本选板&#xff0c;使用相关属性和方法。1. 选择文件新建VI&#xff0…

第1章 ESP32-VSCODE环境搭建

ESP32-VSCODE环境搭建 环境安装 在Windows中安装ESP-IDF在vscode中安装Espressif IDF插件开始配置Espressif IDF插件 在vscode最上方点击&#xff1a;查看->命令面板&#xff0c;输入esp-idf:config&#xff0c;选择ESP-IDF:Configure ESP-IDF extension 选择EXPRESS Sele…