Linux 基础IO 1

news2024/11/16 23:40:43

文件操作

基础IO

在程序中若需要读取文件数据或者将数据永久存入需要使用文件因为程序的产生的数据都是在内存中的,只要关闭程序就会释放掉不会,所以在一些程序中我们难免需要对文件进程操作。无论我们是存入数据还是提取数据前提是有这个数据并清楚它在什么地方。

在进程3中我们了解到了有文件文件描述符,而且当使用printf函数scanf函数或是c++的cout,cin都能读取到键盘的数据或者能向显示器写入数据,这就是因为在每个进程打开的时候操作系统都会默认打开三个文件,分别是输入,输出和错误输出文件所以每个进程都会有这三个文件描述符:0,1,2对应输入输出和错误输出,这三个文件也可以理解为是缓冲区。

每当我们在键盘上按下某个键时就会将这个数据存放进输入缓冲区即0号文件然后我们使用scanf或者cin的时候就会从这个文件中读取数据。

当我们使用printf或者cout在屏幕上打印进程的数据时其实就是向1号文件写入数据,然后通过刷新缓冲区将数据冲刷到屏幕上而显示出来。错误输出与这个同理只不过他只输出进程错误的信息。

所以我们就能知道printf和scanf的工作原理了其实就是按某些标准格式向文件写入数据和取出数据。

open与fopen打开文件

上面我们提到了在进程创建的时候操作系统都会为其打开三个文件0,1,2。那么我们怎么在程序内打开文件呢,就是使用open与fopen函数打开。

open:

open是一个系统调用函数,可以理解为操作系统就是通过这个函数的功能来打开的然后在进程PCB中的文件指针所指向的结构体files struct里面的指针数组中找到最小下标的空位置创建一个指针指向我们打开的文件的信息结构体file struct。这样就完成了对于进程打开一个文件的操作了。

使用open需要包含的头文件:

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

open函数原型:

int open(const char *pathname,int flags);

int open(const char *pathname,int flags,mode_t mode);

第一个参数是需要打开的文件的路径和文件名。如:usr/bin/pwd

第二个参数是对文件的操作方式:

O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开

O_CREAT:若文件不存在则创建

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

O_APPEND:每次写时都加到文件的尾端

里面有些是可以并存的,方式是:O_RDWR|O_CREAT 就是以读写方式打开若文件不存在就创建,我们知道 | 是按位或操作符这里使用这个的原因就是这里用的就是位图,这些值都是一些宏,定义在<fcntl.h>这个头文件中,这些数据都是2的次方也就是”000001“,”00000010“,”0000010000“这样的数据所以这里用的是 | 。

第三个参数一般和创建文件一起使用是指定文件操作权限的,若不知道则按照当前操作系统设置的默认权限。如:写个0600那么就是仅拥有者可以读写,若是写个0666就是所有人都可以读写。

lseek函数是调整文件偏移量的函数,打开文件后若我们进行了读写那么偏移量会被改变,刚打开时偏移量为0就是文件开头的位置,然后我们进行读写会根据读写的数据量进行偏移,也就是当前读取或写入的位置的下一个,所以若我们在文件中写入数据后需要读取其数据需要用lseek函数将其偏移量重新置为初始位置

头文件:

#include <sys/types.h>

 #include <unistd.h>

lseek函数原型

off_t lseek(int fd, off_t offset, int whence);

函数参数:

fd:文件描述符

offset:字节数,以whence参数为基点解释offset(偏移量)

whence:解释offset参数的基点:

SEEK_SET:文件偏移量设置为offset(开头) ​

SEEK_CUR:文件偏移量设置为当前文件偏移量加上offset,offset可以为 负数(末尾) ​

SEEK_END:文件偏移量设置为文件长度加上 offset,offset可以为负数

第二三个参数是配合使用的,若我们设置第三个参数为SEEK_SET, 就是从开头位置开始偏移offset个字节。

fopen:

fopen是一个c标准库的函数,在不同平台可能实现不同但是用法都一致

头文件:

#include <stdio.h>

函数原型

FILE *fopen(const char *filename, const char *mode);

参数:

filename:文件的路径。
mode:文件打开模式,常用的模式有:
"r":以只读模式打开文件。
"w":以只写模式打开文件,若文件存在则清空文件内容。
"a":以追加模式打开文件。
"r+":以读写模式打开文件。
"w+":以读写模式打开文件,若文件存在则清空文件内容。
"a+":以读写追加模式打开文件。

这里的返回值是一个FILE* 文件结构体的指针而不是文件描述符,其用法基本一致。

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

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

相关文章

VGG16模型实现新冠肺炎图片多分类

1. 项目简介 本项目的目标是通过深度学习模型VGG16&#xff0c;实现对新冠肺炎图像的多分类任务&#xff0c;以帮助医疗人员对患者的影像进行快速、准确的诊断。新冠肺炎自爆发以来&#xff0c;利用医学影像如X光和CT扫描进行疾病诊断已成为重要手段之一。随着数据量的增加&am…

联想(lenovo) 小新Pro13锐龙版(新机整理、查看硬件配置和系统版本、无线网络问题、windows可选功能)

新机整理 小新pro13win10新机整理 查看硬件配置和系统版本 设置-》系统-》系统信息 无线网络问题 部分热点可以&#xff0c;部分不可以 问题&#xff1a;是因为自己修改了WLAN的IP分配方式为手动分配&#xff0c;导致只能在连接家里无线网的时候可以&#xff0c;连接其他…

51单片机——独立按键

一、独立按键对应单片机P3管脚&#xff0c;如图 二、按键点亮LED灯 #include <STC89C5xRC.H> void main() { while(1) { if(P300) { P200; } else { P201; } } } 当按键为0时&#xff0c;代表按下&#xff0c;所以当P30按下时&#xff0c;让P20&#xff1d;0&#…

Java面试篇基础部分-ReentrantLock详解

ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。   那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,…

2024年最新网络协议分析器Wireshark抓包详细教程(更新中)

网络协议分析器 Wireshark 安装 Wireshark 是一个功能强大的网络协议分析器&#xff0c;早期叫作 Ethereal。它主要用于捕获网络数据包&#xff0c;并对这些数据包进行详细的解析和分析&#xff0c;帮助用户深入了解网络通信的细节。它支持多种网络协议&#xff0c;并提供详细…

VM虚拟机下载以及激活

传统的官网已经找不到下载了&#xff0c;这里我将下载好的放在阿里云盘&#xff0c;百度云盘太慢了&#xff0c;懂得都得 阿里云盘分享 下载好了后会是一个exe文件&#xff0c;直接双击运行就可 下载无脑下一步即可&#xff0c;这里不做介绍 下载好了后&#xff0c;需要密钥这里…

如何搭建IP代理池:从零开始的详细指南

在网络应用中&#xff0c;IP代理池是一种非常实用的工具&#xff0c;尤其是在需要大量IP地址进行网络请求时&#xff0c;例如网络爬虫、数据抓取和分布式系统等。通过搭建IP代理池&#xff0c;你可以有效地管理和分配IP地址&#xff0c;避免单一IP地址被封锁&#xff0c;提高网…

高效编程的利器 Jupyter Notebook

目录 前言1. Jupyter Notebook简介1.1 功能特点1.2 使用场景 2. 不同编程工具的对比与效率提升2.1 VS Code&#xff1a;灵活且轻量的代码编辑器2.2 PyCharm&#xff1a;面向专业开发者的集成开发环境2.3 Git&#xff1a;高效协作的版本控制工具2.4 Jupyter Notebook 和 VS Code…

【算法题】63. 不同路径 II-力扣(LeetCode)-”如果起点有障碍物,那么便到不了终点“

【算法题】63. 不同路径 II-力扣(LeetCode)-”如果起点有障碍物&#xff0c;那么便到不了终点“ 1.题目 下方是力扣官方题目的地址 63. 不同路径 II 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下…

【Godot4.x】Mesh相关知识总结

概述 很早之前发布过一篇关于几何体程序生成的文章&#xff0c;当时对于三角面和网格的构造其实还没有特别深入的认识&#xff0c;直到自己脑海里想到用二维数组和点更新的方式构造2D类型的多边形Mesh结构&#xff0c;也意识到在Godot中其实Mesh不仅是3D网格&#xff0c;也可以…

LeetCode 每周算法 6(图论、回溯)

LeetCode 每周算法 6&#xff08;图论、回溯&#xff09; 图论算法&#xff1a; class Solution: def dfs(self, grid: List[List[str]], r: int, c: int) -> None: """ 深度优先搜索函数&#xff0c;用于遍历并标记与当前位置(r, c)相连的所有陆地&…

uni-data-select 使用 localdata 传入数据出现 不回显 | 下拉显示错误的 解决方法

目录 1. 问题所示2. 正确Demo3. 下拉显示错误(Bug复现)4. 下拉不回显(Bug复现)1. 问题所示 uni-app的下拉框uni-data-select 使用 localdata 传入数据 主要总结正确的Demo以及复现一些Bug 数据不回显数据不显示下拉选项2. 正确Demo 详细的基本知识推荐阅读:uni-app中的…

Codeforces Round 974 (Div. 3) A-F

封面原图 画师礼島れいあ 下午的ICPC网络赛的难受一晚上全都给我打没了 手速拉满再加上秒杀线段树 这场简直了啊 唯一可惜的是最后还是掉出了1000名 一把上蓝应该没啥希望了吧 A - Robin Helps 题意 侠盗罗宾因劫富济贫而闻名于世 罗宾遇到的 n n n 人&#xff0c;从 1 s …

springMvc的初始配置

基础文件结构(toWeb插件) 1.导入对应依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"ht…

BLE 设备丢包理解

前言 个人邮箱&#xff1a;zhangyixu02gmail.com在学习 BLE 过程中&#xff0c;总能听到 “丢包” 一词&#xff0c;但是我查阅资料又发现&#xff0c;有大佬说&#xff0c;ATT所有命令都是“必达”的&#xff0c;不存在所谓的“丢包”。而且我发现&#xff0c;在宣传 BLE 产品…

tcp、udp通信调试工具Socket Tool

tcp、udp通信调试工具Socket Tool ]

Rust 运算符快速了解

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) Rust编程与项目实战_夏天又到了的博客-CSDN博客 4.1 运 算 符 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&am…

java之单链表的基本概念及创建

1.链表的概念: 链表是一种 物理存储结构上非连续 存储结构&#xff0c;数据元素的 逻辑顺序 是通过链表中的 引用链接 次序实现的 。 组成结构: 由一系列节点组成&#xff0c;每个节点包含数据域和指向下一个节点的指针。 优点: 动态大小&#xff0c;易于插入和删除操作。 缺点…

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术&#xff0c;tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域&#xff0c;如何把核苷酸或氨基酸序列tokenization成token呢&#xff1f; 我们可以使用k-mer技术&#xff1a; k-m…