2.Linux文件IO基础

Linux 文件 I/O(Input/Output)基础是 Linux 应用程序开发中的重要组成部分。在 Linux 系统中,文件 I/O 涉及到文件的读取和写入,以及文件描述符、系统调用等概念。以下是 Linux 文件 I/O 的基础知识:

1. 文件描述符

在 Linux 中,每个打开的文件都与一个文件描述符相关联。文件描述符是一个非负整数,表示进程中打开文件的引用。通常,文件描述符的值为 0、1 和 2,分别代表标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。

2. 打开文件

要在 Linux 中进行文件 I/O,首先需要打开文件。open 系统调用用于打开或创建文件,并返回文件描述符。

#include <fcntl.h>
#include <unistd.h>int main() {// 打开文件 example.txt,如果不存在则创建,以读写方式打开int fileDescriptor = open("example.txt", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);// 其他文件 I/O 操作...// 关闭文件close(fileDescriptor);return 0;
}

3. 读取文件

read 系统调用用于从文件中读取数据。它接受文件描述符、缓冲区地址和读取的字节数作为参数。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>int main() {int fileDescriptor = open("example.txt", O_RDONLY);char buffer[256];// 从文件中读取数据到缓冲区ssize_t bytesRead = read(fileDescriptor, buffer, sizeof(buffer));// 处理读取的数据std::cout << "Read " << bytesRead << " bytes: " << buffer << std::endl;close(fileDescriptor);return 0;
}

4. 写入文件

write 系统调用用于将数据写入文件。它接受文件描述符、缓冲区地址和写入的字节数作为参数。

#include <fcntl.h>
#include <unistd.h>int main() {int fileDescriptor = open("example.txt", O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR);const char* data = "Hello, Linux!";// 将数据写入文件ssize_t bytesWritten = write(fileDescriptor, data, strlen(data));// 处理写入的数据...close(fileDescriptor);return 0;
}

5. 移动文件指针

lseek 系统调用用于在文件中移动文件指针的位置。它接受文件描述符、偏移量和移动的位置(例如 SEEK_SETSEEK_CURSEEK_END)作为参数。

#include <fcntl.h>
#include <unistd.h>int main() {int fileDescriptor = open("example.txt", O_RDWR);off_t offset = lseek(fileDescriptor, 5, SEEK_SET);  // 将文件指针移动到文件开头后的第 5 个字节// 处理文件指针位置...close(fileDescriptor);return 0;
}

6. 关闭文件

close 系统调用用于关闭文件。关闭文件后,与文件描述符相关联的资源将被释放。

#include <unistd.h>int main() {int fileDescriptor = open("example.txt", O_RDWR);// 其他文件 I/O 操作...// 关闭文件close(fileDescriptor);return 0;
}

7. 文件 I/O 错误处理

在进行文件 I/O 操作时,需要进行错误处理以处理可能发生的错误。通常,系统调用的返回值为 -1 表示发生了错误,此时可以使用全局变量 errno 获取错误码,并使用 perror 函数输出错误信息。

#include <fcntl.h>
#include <unistd.h>
#include <cerrno>
#include <cstring>
#include <iostream>int main() {int fileDescriptor = open("nonexistent_file.txt", O_RDONLY);if (fileDescriptor == -1) {perror("Error opening file");std::cerr << "Error code: " << errno << ", Message: " << strerror(errno) << std::endl;return 1;}// 其他文件 I/O 操作...close(fileDescriptor);return 0;
}

8. 文件和目录操作

Linux 提供了一系列的文件和目录操作函数,可以用于获取和修改文件和目录的属性。以下是一些常见的文件和目录操作:

获取文件信息

使用 stat 函数可以获取文件的详细信息,包括文件类型、权限、大小等。

#include <sys/stat.h>
#include <unistd.h>
#include <iostream>int main() {struct stat fileInfo;if (stat("example.txt", &fileInfo) == 0) {std::cout << "File size: " << fileInfo.st_size << " bytes" << std::endl;std::cout << "File permissions: " << (fileInfo.st_mode & 0777) << std::endl;// 其他文件信息...} else {perror("Error getting file information");}return 0;
}
创建和删除文件

使用 creat 函数可以创建新的文件,而 unlink 函数用于删除文件。

#include <fcntl.h>
#include <unistd.h>int main() {int fileDescriptor = creat("newfile.txt", S_IRUSR | S_IWUSR);if (fileDescriptor != -1) {// 文件创建成功// 其他文件 I/O 操作...close(fileDescriptor);} else {perror("Error creating file");}// 删除文件if (unlink("newfile.txt") == 0) {// 文件删除成功} else {perror("Error deleting file");}return 0;
}
创建和删除目录

使用 mkdir 函数可以创建新的目录,而 rmdir 函数用于删除目录。

#include <sys/stat.h>
#include <unistd.h>int main() {// 创建目录if (mkdir("newdir", S_IRWXU | S_IRWXG | S_IRWXO) == 0) {// 目录创建成功} else {perror("Error creating directory");}// 删除目录if (rmdir("newdir") == 0) {// 目录删除成功} else {perror("Error deleting directory");}return 0;
}
重命名和移动文件

使用 rename 函数可以重命名文件,而 rename 函数也可以用于移动文件。

#include <unistd.h>int main() {// 重命名文件if (rename("oldfile.txt", "newfile.txt") == 0) {// 文件重命名成功} else {perror("Error renaming file");}// 移动文件if (rename("sourcefile.txt", "targetdir/destinationfile.txt") == 0) {// 文件移动成功} else {perror("Error moving file");}return 0;
}

以上是一些文件和目录操作的基础概念,涵盖了获取文件信息、创建和删除文件、创建和删除目录、以及重命名和移动文件等操作。这些操作在实际应用程序开发中经常用到,根据需求可以选择合适的函数进行调用。

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

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

相关文章

GEE Rgee——使用 eemont 和 geemap来进行Landsat 8数据的反演NDSI

简介 用 rgee 在 R 中使用 eemont 和 geemap来快速进行NDSI反演。 Landsat 8是一颗运行于太阳同步轨道上的遥感卫星,可以获取高分辨率的光学遥感数据,其中包括多光谱和热红外波段。NDSI(Normalized Difference Snow Index)是一种用于检测和分析雪被覆盖情况的指数。本文将…

算法刷题day25:多路归并

目录 引言概念一、鱼塘钓鱼二、技能升级三、序列 引言 关于这个多路并归蓝桥杯考的不是很多&#xff0c;如果要出的话&#xff0c;可能模型都会差不多&#xff0c;因为不会出太难的题&#xff0c;难题基本上都是贪心、DP之类的&#xff0c;所以好好刷题刷熟练就行了&#xff0…

ms office学习记录10:Excel㈣

自动填充时也可输入前几个值&#xff0c;选中单元格双击右下角黑色箭头进行填充 将填充样本行列粘贴至原列后要注意删除样本行列内容 排序与筛选 “数据”选项卡中的“排序”与“开始”选项卡中的“排序和筛选”实质相同 排序依据&#xff1a;数值内容和数值格式 “选项”…

最大的单入口空闲区域

最大的单入口空闲区域 问题描述输入输出代码实现 问题描述 找到最大的单入口空闲区域。 空闲区域是由连通的’O’组成的区域&#xff0c;位于边界的’O’可以是入口&#xff0c; 单入口空闲区域即有且只有一个位于边界的’O’作为入口的由连通的’O’组成的区域。 如果两个元素…

Docker使用之Docker Compose【入门篇】

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。它允许用户通过一个单一的文件来定义多个容器&#xff0c;然后使用一个命令来启动、停止和管理这些容器。在本文中&#xff0c;我们将详细介绍如何使用Docker Compose进行多容器管理&#xff0c;并提供一个范例…

大数据开发(Spark面试真题-卷六)

大数据开发&#xff08;Spark面试真题&#xff09; 1、Spark HashPartitioner和RangePartitioner的实现&#xff1f;2、Spark DAGScheduler、TaskScheduler、SchedulerBackend实现原理&#xff1f;3、介绍下Sparkclient提交application后&#xff0c;接下来的流程&#xff1f;4…

查找C++中所有代码行数超过100的类成员函数

执行效果 python3 find_large_functions.py ./stage_test.cpp: StageTest::process has 106 lines. ./stage_test.cpp: StageTest::do_test_ has 172 lines.实现方法 在检测到函数开始的“可能”标志后&#xff08;比如返回类型和作用域运算符::&#xff09;&#xff0c;开始…

Vue-router

router的使用&#xff08;52&#xff09; 5个基础步骤&#xff1a; 1.在终端执行yarn add vue-router3.6.5&#xff0c;安装router插件 yarn add vue-router3.6.5 2.在文件的main.js中引入router插件 import VueRouter from vue-router 3.在main.js中安装注册Vue.use(Vue…

力扣:链表篇章

1、链表 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#xff09;。 2、链表的类…

Python高级二

一、异常 1、定义 异常是在程序执行过程中出现的错误或意外情况。当程序遇到异常时&#xff0c;它会中断当前的执行流程&#xff0c;并尝试找到相应的异常处理机制来解决问题。 2、常见异常类型 SyntaxError&#xff1a;语法错误&#xff0c;通常是代码书写不符合Python语法规则…

【前端】移动端布局

目录 1.移动端特点 分辨率 二倍图 2.百分比布局 3.flex布局 3.1flex布局模型 3.2主轴对齐方式 3.3 侧轴对齐方式 3.4flex属性 1.移动端特点 PC端网页和移动端网页的不同 PC端网页&#xff1a;屏幕大&#xff0c;网页固定版心 jd.com移动端网页&#xff1a;屏幕小 没…

实战案例——Kafka集群部署

1. 规划节点 IP主机名节点192.168.100.10zookeeper1集群节点192.168.100.20zookeeper2集群节点192.168.100.30zookeeper集群节点 2. 基础准备 使用ZooKeeper集群搭建的3个节点来构建Kafka集群&#xff0c;因为Kafka服务依赖于ZooKeeper服务&#xff0c; 所以不再多创建云主机…

vue前端获取本地IP地址

新建js文件 getIpAddress.js //获取本机的IP地址 function getNetworkIp() {let ip localhost;try {const network Os.networkInterfaces();//获取本机的网路for (const iter in network) {const faces network[iter];for (const interface of faces) {if (interface.fami…

接口自动化测试的三个阶段

根本目标 测试环境中&#xff0c;保证新增接口功能正确性&#xff0c;原有接口的回归&#xff08;保证原有接口不被修改“坏”&#xff09;&#xff1b; 生产环境中&#xff0c;保证接口层面服务可用&#xff0c;功能的正确性&#xff08;保证服务挂掉时&#xff0c;及时发现…

pytorch入门

相比起keras和tensorflow,个人感觉pytorch更好一些 相比起程序语言本身,个人感觉,记住解决问题的步骤和方法更重要 import torch ttorch.tensor(1) t.size() t1torch.rand((3,4)) torch.Tensor? torch.empty((3,3)) devicetorch.device(cuda if torch.cuda.is_available() els…

Python爬网页,不确定网页的编码,不需要用第三方库

Python爬网页&#xff0c;不确定网页的编码&#xff0c;不需要用第三方库&#xff0c;自己写个判断&#xff0c;乱拳打死老师傅 detect试了&#xff0c;不好用 apparent_encoding试了&#xff0c;不好用 encoding试了&#xff0c;不好用 headers里get试了&#xff0c;不好用…

户口本怎么翻译成英文

户口本翻译件一般用于出国旅游签证、商务签证、移民留学等业务时&#xff0c;申请人所需提交的文件之一。户口本翻译件需要正规有资质的翻译机构翻译并加盖翻译专用章,这样才能得到有关部门的认可。那么&#xff0c;英国签证户口本翻译&#xff0c;中译英怎么翻译比较好&#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(模态转场设置:全屏模态转场)

通过bindContentCover属性为组件绑定全屏模态页面&#xff0c;在组件插入和删除时可通过设置转场参数ModalTransition显示过渡动效。 说明&#xff1a; 从API Version 10开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 不支持横竖屏切换。…

TCP三次握手,四次挥手状态转移过程

1.TCP状态转移过程 TCP连接的任意一端都是一个状态机,在TCP连接从建立到断开的整个过程中,连接两端的状态机将经历不同的状态变迁.理解TCP状态转移对于调试网络应用程序将有很大的帮助. 2.三次握手状态转换 3.四次挥手状态转换 4.TIME WAIT状态详解 为什么要有一个"TIME…

数据标注专业团队

数据标注服务 在跟一些淘宝、多多商家老板合作后&#xff0c;客户一般付款后&#xff0c;中介是有20%左右的提成&#xff0c;我们主要是希望可以实现数据标注无中介化&#xff0c;有需求可以直接联系数据标注团队直接负责人&#xff0c; 若有意愿请添加添加v&#xff1a;shu_ju…