Linux系统编程_文件编程第1天:打开、写入、读取、关闭文件等编程

1. 文件编程概述(399.1)

  • 内容超多:
    • 文件系统原理及访问机制
    • 文件在内核中的管理机制
    • 什么是文件信息节点inode
    • 文件的共享
    • 文件权限,各种用户对其权限
    • 。。。。。。
  • 应用为王,如:
    • 账单
    • 游戏进度
    • 配置文件等
  • 关心如何用代码操作文件,实现文件创建、打开、编辑等自动化执行
  • Windows 如何手动修改文件,比如写一个 word 文档:
    • 打开/创建文档、编辑文档、保存文档、关闭文档
  • 计算机如何帮助我们自动化完成以上操作?
  • 操作系统提供了一系列的 API,如 Linux 系统:
    • 打开 open
    • 读写 write /read
    • 光标定位 lseek
    • 关闭 close

2. 文件打开及创建(400.2)

打开/创建文件

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

参数说明

在这里插入图片描述

  • int 返回值:文件描述符,应为小的非负整数
  • Pathname:要打开的文件名(含路径,缺省为当前路径)
  • Flags:
    • O_RDONLY 只读打开
    • O_WRONLY 只写打开
    • O_RDWR 可读可写打开
      • 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
      • 以上这三个常数中应当指定一个。
    • 下列常数是可选择的:
      • O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数 mode(0600),用其说明该新文件的存取许可权限
      • O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错
      • O_APPEND:每次写时都加到文件的尾端
      • O_TRUNC:属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为 0。
  • Mode:一定是在 flags 中使用了 O_CREAT 标志,mode 记录待创建的文件的访问权限
  • FILE/demo.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
int main(){int fd;//文件描述符,索引值fd = open("./file1",O_RDWR);//文件名(含路径),可读可写权限printf("fd = %d\n",fd);return 0;
}

在这里插入图片描述

  • FILE/demo2.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件int main(){int fd;fd = open("./file1",O_RDWR);printf("fd = %d\n",fd);if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建if(fd > 0){printf("fd = %d\n",fd);printf("create file1 success!\n");}}return 0;
}

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

  • -rwx:
    • -:普通文件
    • r:可读
    • w:可写
    • x:可执行
      在这里插入图片描述

3. 文件写入操作编程(401.3)

  • 查看函数原型
    在这里插入图片描述

写入文件

在这里插入图片描述

  • write 返回的是写入的字节数
  • FILE/demo3.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件int main(){int fd;char *buf = "Jessie is very kind.";fd = open("./file1",O_RDWR);printf("fd = %d\n",fd);if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建if(fd > 0){printf("fd = %d\n",fd);printf("create file1 success!\n");}}printf("open success : fd = %d\n",fd);//打开文件//ssize_t write(int fd, const void *buf, size_t count);//write的函数原型write(fd,buf,strlen(buf));//写入文件//在Linux中指针是固定8个字节,所以不能用sizeof//stlen计算字符串长度close(fd);//关闭文件return 0;
}

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

4. 文件读取操作(402.4)

读取文件

在这里插入图片描述

  • read 返回的是读取的字节数
    在这里插入图片描述
  • FILE/demo4.c
  • FILE/demo5.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;char *buf = "Jessie is very kind.";fd = open("./file1",O_RDWR);printf("fd = %d\n",fd);if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建if(fd > 0){printf("fd = %d\n",fd);printf("create file1 success!\n");}}printf("open success : fd = %d\n",fd);//打开文件//ssize_t write(int fd, const void *buf, size_t count);int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数if(n_write != -1){printf("write %d byte to file1\n",n_write);}close(fd);fd = open("./file1",O_RDWR);//重新打开文件,光标移至头char *readBuf;readBuf = (char *)malloc(sizeof(char)*n_write + 1);	//ssize_t read(int fd, void *buf, size_t count);//read的函数原型int n_read = read(fd,readBuf,n_write);//存储从fd中读出的readBuf的所有的字节数printf("read %d ,context:%s\n",n_read,readBuf);close(fd);//关闭文件return 0;
}

5. 文件光标移动操作(403.5)

将文件读写指针相对whence移动offset个字节

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

  • FILE/demo6.c(打开、写入、定位光标、读取数据)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;char *buf = "Jessie is very kind.";fd = open("./file1",O_RDWR);printf("fd = %d\n",fd);if(fd == -1){printf("open file1 failed\n");fd = open("./file1",O_RDWR|O_CREAT,0600);//若文件不存在则创建if(fd > 0){printf("fd = %d\n",fd);printf("create file1 success!\n");}}printf("open success : fd = %d\n",fd);//打开文件//ssize_t write(int fd, const void *buf, size_t count);//write的函数原型int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数if(n_write != -1){printf("write %d byte to file1\n",n_write);}//close(fd);//fd = open("./file1",O_RDWR);//重新打开文件,光标移至头char *readBuf;readBuf = (char *)malloc(sizeof(char)*n_write + 1);	//ssize_t read(int fd, void *buf, size_t count);//read的函数原型//off_t lseek(int fd, off_t offset, int whence);//lseek的函数原型//lseek(fd,0,SEEK_SET);lseek(fd,-20,SEEK_CUR);//lseek(fd,-20,SEEK_END);int n_read = read(fd,readBuf,n_write);//存储从fd中读出的readBuf的所有的字节数printf("read %d ,context:%s\n",n_read,readBuf);close(fd);//关闭文件return 0;
}
  • FILE/demo7.c(lseek返回有多少个字节)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;char *buf = "Jessie is very kind.";fd = open("./file1",O_RDWR);int filesize = lseek(fd,0,SEEK_END);//lseek返回多少个字节printf("file's size is :%d\n",filesize);close(fd);//关闭文件return 0;
}

关闭文件

在这里插入图片描述

6. 文件打开创建的补充(404.6)

O_EXCL:如果同时指定了 OCREAT,而文件已经存在,则出错(即返回-1)

  • FILE/demo8.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>int main(){int fd;fd = open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);//若文件不存在则创建,已存在则出错if(fd == -1){printf("File1 exists.\n");}return 0;
}

O_APPEND:每次写时都加到文件的尾端(另起一行)

  • FILE/demo9.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;char *buf = "Jessie is very kind.";//fd = open("./file1",O_RDWR);fd = open("./file1",O_RDWR|O_APPEND);//另起一行添加字符printf("open success : fd = %d\n",fd);//打开文件int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数if(n_write != -1){printf("write %d byte to file1\n",n_write);}close(fd);//关闭文件return 0;
}
  • 有 O_APPEND 时:另起一行添加
    在这里插入图片描述
  • 无 O_APPEND 时:覆盖原先对应位置的字符,保留后边的字符
    在这里插入图片描述

O_TRUNC:去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0(即删除原来的所有字符)

  • FILE/demo10.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;char *buf = "Jessie.";fd = open("./file1",O_RDWR|O_TRUNC);//打开已有文件时,清空字符printf("open success : fd = %d\n",fd);//打开文件int n_write = write(fd,buf,strlen(buf));//存储在fd中写入所有的buf后的字节数if(n_write != -1){printf("write %d byte to file1\n",n_write);}close(fd);//关闭文件return 0;
}

在这里插入图片描述

创建文件creat函数

在这里插入图片描述

  • FILE/demo11.c
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>//以上三行为open函数需包含的头文件
#include <stdio.h>//printf函数需包含的头文件
#include <unistd.h>//write函数需包含的头文件
#include <string.h>//strlen的头文件
#include <stdlib.h>//malloc的头文件int main(){int fd;//int creat(const char *pathname, mode_t mode);fd = creat("./file2",S_IRWXU);return 0;
}

在这里插入图片描述

7. 文件操作原理简述(审核不过./7)

文件描述符

在这里插入图片描述

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

  • FILE/demo12.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;char readBuf[128];int n_read = read(0,readBuf,5);//从标准输入(键盘)读int n_write = write(1,readBuf,strlen(readBuf));//写到标准输出(UNIX shell)printf("\ndone!\n");return 0;
}

文件编程的一般步骤

  • 打开/创建文件、读取文件/写入文件、关闭文件
    在这里插入图片描述

在这里插入图片描述

Linux文件管理简述

在这里插入图片描述

8. 文件操作小应用之实现cp指令(405.8)

在这里插入图片描述

  • FILE/test1.c(先做测试)
#include <stdio.h>int main(int argc, char **argv){printf("totol params: %d\n",argc);//参数总数printf("No.1 params :%s\n",argv[0]);//参数名称,数组的形式//a.outprintf("No.2 params :%s\n",argv[1]);//srcprintf("No.3 params :%s\n",argv[2]);//des()return 0;
}

在这里插入图片描述

  • FILE/demo13.c( 实现linux cp命令的代码)
#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;//源文件描述符int fdDes;//目标文件描述符char *readBuf=NULL;if(argc != 3){//对参数个数的判断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);//开辟比源文件多8个字节的大小lseek(fdSrc,0,SEEK_SET);//光标移至源文件内容的头int n_read = read(fdSrc, readBuf, size);//读源文件到readBuf,要用sizefdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//打开/创建目标文件,目标文件已存在时清空内容int n_write = write(fdDes,readBuf,strlen(readBuf));//将readBuf写入目标文件close(fdSrc);//关闭源文件close(fdDes);//关闭目标文件return 0;
}

在这里插入图片描述

9. 解决上节课中的隐藏bug(406.9)

  • FILE/demo13.c( 实现linux cp命令的代码)
int n_read = read(fdSrc, readBuf, size);//读源文件到readBuf,要用sizefdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);//打开/创建目标文件,目标文件已存在时清空内容

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

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

相关文章

Apache Doris 在小鹅通的应用实践

峰会官网已上线&#xff0c;最新议程请关注&#xff1a;doris-summit.org.cn 点击报名 先到先得 本文导读&#xff1a; 随着网络直播规模的不断扩大&#xff0c;在线知识服务在直播行业中迎来了广阔的发展机遇。小鹅通作为一家以用户服务为核心的技术服务商&#xff0c;通过多平…

简单实现一个todoList(上移、下移、置顶、置底)

演示 html部分 <!DOCTYPE html> <html> <head><title>表格示例</title> </head> <body><table border"1"><thead><tr><th>更新时间</th><th>操作</th></tr></thead…

2023-10-12 LeetCode每日一题(找出数组的串联值)

2023-10-12每日一题 一、题目编号 2562. 找出数组的串联值二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 。 现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。 例如&#xff0c;15 和 49 的串联是 1549 。 nums 的 串…

BootStrap-前端框架

资料:https://v3.bootcss.com/components/ BootStrap的概念&#xff08;Web框架&#xff09; Bootstrap&#xff0c;来自 Twitter&#xff0c;是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。…

给电瓶车“消消火”——TSINGSEE青犀智能电瓶车棚监控方案

近年来&#xff0c;电瓶车电梯起火、室内起火、楼道起火的新闻层出不穷&#xff0c;很多人为了图方便就将电瓶车推到家中充电&#xff0c;这种十分危险的行为&#xff0c;严重影响了社区的公共安全和个人生命财产&#xff0c;为什么惨痛新闻不断播出&#xff0c;这种行为还是屡…

el-dialog两个弹框里面套弹框受外层弹框影响

el-dialog嵌套的影响及解决方法 解决方法如下&#xff1a; 在里层弹框里添加 append-to-body <el-dialogtitle"图片预览":visible.sync"dialogVisible"class"imgDialog":modal"false"append-to-body><img width"100%&q…

nodejs+vue电子病历管理系统

过软件的需求分析已经获得了系统的基本功能需求&#xff0c;根据需求&#xff0c;将电子病历管理系统功能模块主要分为管理员模块。管理员添加科室信息管理、项目分类管理、药品分类管理、公告信息管理、用户管理等操作。 本系统结合计算机系统的结构、概念、模型、原理、方法&…

LiveMedia视频中间件视频隐私打码直播解决方案

一、方案背景 随着科技的发展&#xff0c;视频监控系统已经成为了我们生活中不可或缺的一部分。无论是在公共区域&#xff0c;还是在私人场所&#xff0c;我们都可以看到各种各样的监控设备。这些设备的出现&#xff0c;无疑提高了我们的生活安全&#xff0c;使得我们可以更好地…

cas-server5.3自定义密码校验规则

前面几篇文章都是关于cas的,今天继续,cas有自己的一个加密配置.如果只是简单使用MD5或者SM3等加密算法进行加密的话,可以不需要再进行自定义操作,但是我们一般还会给用户密码加盐,这样的话原本的配置就不满足了,所以需要再自定义一个密码校验规则 实现PasswordEncoder接口 Pa…

Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突

注释掉2.0引入的俩包 直接引入3.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency> swagger配置文件粘贴即用哦 import org.springfram…

linux 给根目录扩容(lvm CentOS 7.6 kylinx86)

问题:Linux系统挂载到根目录的磁盘空间满了,如何扩容? 用命令:lsblk 可以查看磁盘和分区情况,可以发现磁盘vda下面的还有大部分空间没有使用。 操作步骤 1、使用 fdisk -l 查看硬盘序号,并用 fdisk 对硬盘操作,格式化成lvm的格式 (用命令lsblk可以看到,挂载到根目录…

ppt怎么压缩到10m以内?分享ppt缩小方法

在日常工作中&#xff0c;我们常常需要制作和分享PowerPoint演示文稿&#xff0c;然而&#xff0c;有时候文稿中的图片、视频等元素会导致文件过大&#xff0c;无法在电子邮件或其他平台上顺利传输。为了将PPT文件压缩到10M以内&#xff0c;我们可以使用一些专门的文件压缩工具…

SQL sever中的索引

目录 一、索引定义 二、索引结构 2.1. B-树索引结构&#xff1a; 2.2. 哈希索引结构&#xff1a; 三、索引作用 四、索引与约束区别 五、索引级别 六、索引分类 6.1. 聚集索引&#xff08;Clustered Index&#xff09;&#xff1a; 6.2. 非聚集索引&#xff08;Noncl…

PyQt5 PyQt6 Designer 的安装

pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科学技术大学 http://pypi.mirrors.ustc.…

Open Winding-PMSM-开绕组永磁同步电机基本介绍

文章目录 前言简介Open Widing电机数学模型零序模型 双逆变器调制零序电流抑制基本思路 前言 最近看了些Open Winding永磁同步电机及其控制策略的文献资料&#xff0c;现做个总结。未来的研究方向也大概率围绕Open Winding开展&#xff0c;期待同行交流学习。 简介 开绕组(O…

互联网Java工程师面试题·Java 并发编程篇·第三弹

目录 26、什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; 27、为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 27.1 为什么要使用 Executor 线程池框架 27.2 使用 Executor 线程池框架的优点 28、java 中有几种方法可以实现一个线程…

【java学习—七】单继承和多层继承(30)

文章目录 1. 相关概念2. 从代码中理解 1. 相关概念 Java 只支持单继承&#xff0c;不允许多重继承&#xff1a; &#xff08;1&#xff09;一个子类只能有一个父类 &#xff08;2&#xff09;一个父类可以派生出多个子类      举例区分&#xff1a; class SubDemo extend…

【大数据】Hadoop MapReduce与Hadoop YARN(学习笔记)

一、Hadoop MapReduce介绍 1、设计构思 1&#xff09;如何对付大数据处理场景 对相互间不具有计算依赖关系的大数据计算任务&#xff0c;实现并行最自然的办法就是采取MapReduce分而治之的策略。 不可拆分的计算任务或相互间有依赖关系的数据无法进行并行计算&#xff01; …

OCP Java17 SE Developers 复习题05

答案 答案 A, E. Instance and static variables can be marked final, making option A correct. Effectively final means a local variable is not marked final but whose value does not change after it is set, making option B incorrect. Option C is incorrect, a…

ideal远程Debug部署在服务器上的服务详解

ideal远程Debug部署在服务器上的服务详解 一 简介二 ideal配置步骤第一步&#xff1a;点击Edit Configurations选项添加远程连接第二步&#xff1a;配置Remote JVM debug参数第三步&#xff1a;服务的启动参数中添加第二步生成的命令并重新启动服务第四步&#xff1a;ideal启动…