IO进程 学习笔记

……接上文

fputs(输入字符串)

int fputs(const char *s, FILE *stream);
   功能:向指定文件中输入一串字符
   参数:
         s:输入字符串的首地址
		 stream:文件流指针
	返回值:成功返回输出字符个数
	失败返回EOF

文件指针偏移函数

1. rewind
void rewind(FILE *stream)
功能:将文件指针定位到文件开头
参数:流指针2.ftell
long ftell(FILE *stream)
功能:计算文件指针当前的位置(相对于文件开头)
返回值:成功:返回当前文件指针相较于开头的字节数
        失败:-13.fseek
int fseek(FILE *stream, long offset, int whence);
		功能:将文件指针偏移到指定位置
		参数:
		    stream:流指针
			offset:偏移量   +5 --》相对于位置向后偏移5byte-5 --》相对于位置向前偏移5byte
			whence:相对位置SEEK_SET:开头SEEK_CUR:当前SEEK_END:结尾
		返回值:成功:0
		    失败:-1,更新errno
举例:
fseek(fp,-10SEEK_END
fseek(fp,-10SEEK_CUR

练习:使用ftell计算文件的长度

#include <stdio.h>
int main(int argc, char const *argv[])
{
    FILE *fp = fopen(argv[1],"r");if (fp == NULL){perror("fopen filed");return -1;}//定位到文件的末尾fseek(fp,0,SEEK_END);//计算文件的长度long lenth = ftell(fp);printf("len:%ld",lenth);fclose(fp);return 0;
}

文件IO

概念

内核向上提供的输出输出函数接口,叫做系统调用函数接口。基于内核,内核不同,系统调用函数接口不同,文件IO不同操作系统函数接口不通用。可移植性较差。

文件IO的特点

(API 函数接口

  1. 没有缓存机制,每次调用都会引起系统调用。
  2. 围绕文件描述符进行操作,文件描述符都是非负的整数,依次进行分配。
  3. 文件IO默认打开三个文件描述符,0(标准输入),1(标准输出),2(标准错误)
  4. 可以操作除了目录文件外的任意类型的文件。

文件描述符

文件描述符都是非负的整数,取值范围(0-1023),最多产生1024个文件描述符,文件描述符被分配的时候是连续的。关闭文件描述符之后才可以提供给其他文件使用。

函数接口

open函数打开文件)

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
      flags:打开文件的方式
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:可读可写
            O_CREAT:创建
            O_TRUNC:清 空
            O_APPEND:追加   
 返回值:成功:返回文件描述符
         失败:-1rO_RDONLY
r+: O_RDWR
w: O_WRONLY | O_CREAT | O_TRUNC ,0666
w+: O_REWR | O_CREAT | O_TRUNC , 0666
a: O_WRONLY | O_CREAT | O_APPEND , 0666
a+: O_REWR | O_CREAT | O_APPEND , 0666当文件的打开方式中存在   O_CREAT:创建 时
int open(const char *pathname, int flags, mode_t mode);
mode:创建文件的权限  ,只有在打开方式中有O_CREAT才填充这个参数
创建的文件实际的权限位mode & ~umask。umask是权限掩码,值为0002。  如mode=0666,即创建的文件权限为0664
用于控制新文件或目录的默认权限的设置。它决定了在创建新文件或目录时,哪些权限会被屏蔽查看权限掩码:umask
修改权限掩码:umask 0000     

close函数关闭文件描述符)

 #include <unistd.h>int close(int fd);
 功能:关闭文件
 用法:close(fd); 示例代码:#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(int argc, char const *argv[])
{//打开文件int fd = open("./a.txt", O_RDWR | O_CREAT | O_TRUNC, 0666);if (fd == -1){perror("open err");return -1;}printf("fd:%d\n",fd);//关闭文件close(fd);return 0;
}

read函数读文件)

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:读文件
参数:fd:文件描述符
      buf:存放内容的首地址
      count:期待读取字符的个数
返回值:成功实际读到字符的个数,读到文件结尾返回0
        失败返回-1,更新errno注意事项:使用read函数时需要注意:read读文件,一般期待读多少字符就是读多少,不会自动补’\0,遇到\n也不会自动停止读取,会继续读下一行的内容。
'\0'需要自己补充,考虑预留一个字节补'\0'使用技巧
1.通过返回值作为实际读到的字符个数,后面补‘\0;
char buf[32];
int ret = read(fd,buf,31);
buf[ret] =  '\0';
2.每次读取的内容读取之前先清空数组
清空函数:bzero memset

write函数(写文件)

 ssize_t write(int fd, const void *buf, size_t count);
功能:写文件
参数:
    fd:文件描述符
    buf:写内容存放的首地址
    count:期待写字符的个数
返回值:成功实际写字符的个数
    失败返回-1,更新errno 使用技巧:
int ret = read(fd,buf,32); //read函数返回值读取字符个数
write(fd,buf,ret);

lseek(偏移函数)

#include <sys/types.h>
#include <unistd.h>       off_t lseek(int fd, off_t offset, int whence);
	   功能:将文件指针移动到指定位置
	   参数:
	       fd:文件描述符
		   offset:偏移量  +向后 -向前
		   whence:相对位置SEEK_SET:开头SEEK_CUR:当前SEEK_END:结尾
	返回值:成功:当前位置(基于文件开头)
	        失败:-1,更新errno

lssekfd0,SEEK_SET)//偏移开头

标准IO文件IO对比

标准IO

文件IO

概念

c库中定义的一组用于输入输出的函数接口

系统中定义的一组用于输入输出的函数接口

特点

  1. 标准IO是C库中提供的一组专门用于输入输出的函数接口
  2. 标准IO不仅在Unix系统上,在很多操作系统上都实现了标准IO。
  3. 标准I/O通过缓冲机制减少系统调用,提高效率
  4. 标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE *来描述。
  5. 标准IO默认打开三个流:标准输入(stdin),标准输出(stdout),标准出错(stderr)。

  1. 没有缓存机制,每次调用都会引起系统调用。
  2. 围绕文件描述符进行操作,文件描述符都是非负的整数,依次进行分配。
  3. 文件IO默认打开三个文件描述符,0(标准输入),1(标准输出),2(标准错误)
  4. 可以操作除了目录文件外的任意类型的文件。

函数:

打开文件:fopen

关闭文件:fclose

读写操作:fgetc fputc fputs fgets fread fwrite

定位操作:fseek rewind ftell

时间:time localtime

其他:fflush fprintf perror

打开文件:open

关闭文件:close

读写操作:read write

定位操作:lseek

目录操作函数

opendir打开目录

#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
功能:打开目录文件
参数:name:文件名
返回值:成功返回目录流指针
        失败返回NULL示例代码;
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
int main(int argc, char const *argv[])
{//打开当前目录
    DIR *dirp = opendir("./");if (dirp == NULL){perror("opendir err");return -1;}return 0;
}

closedir关闭目录

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
功能:关闭目录
   参数:dirp:目录流指针
   返回值:成功0,失败-1,更新errno

readdir读取目录内容

#include <dirent.h>
struct dirent *readdir(DIR *dirp);
功能:读取目录中的内容
参数:dirp:目录流指针
返回值:成功返回结构体指针,读到结尾返回NULL
    失败返回NULL,更新errnostruct dirent {
           ino_t      d_ino;       /* 文件的inode号 */
           off_t      d_off;       /* Not an offset; see below */unsigned short d_reclen;    /* Length of this record */
unsigned char  d_type;      /* 文件类型,但不是所有的都支持                                          
       char           d_name[256]; /*文件名 */};

练习使用以上的三个函数实现ls的功能

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
int main(int argc, char const *argv[])
{
    DIR *dirp = opendir("./");if (dirp == NULL){perror("opendir err");return -1;}struct dirent *ch = readdir(dirp);while (ch != NULL){if (ch->d_name[0] != '.'){printf("%s  ", ch->d_name);}
        ch = readdir(dirp);}printf("\n");closedir(dirp);return 0;
}

chdir修改所处路径

chdir 修改当前所处路径#include <unistd.h>int chdir(const char *path);
     功能:改变当前所处的路径
	 参数:path:修改的路径、
	 返回值:成功0
	      失败:-1,更新errno示例代码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char const *argv[])
{chdir("../");int fd = open("./aa.txt", O_RDWR | O_CREAT | O_TRUNC,0777);if (fd == -1){perror("open err");return -1;}close(fd);return 0;
}

                                                                                                                                   未完待续……

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

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

相关文章

Ubuntu压缩打包解压

ubuntu压缩打包 上图&#xff0c;压缩当前目录svn 为svn.tar.gaz&#xff0c;解压后再当前解压目录生成svn文件 在Ubuntu中&#xff0c;你可以使用tar命令来创建一个压缩包&#xff0c;或者使用zip命令来创建一个.zip压缩文件。以下是两种常见的压缩方法&#xff1a; 下图&am…

支付宝租赁小程序助力便捷生活新方式

内容概要 支付宝租赁小程序为现代人带来了许多惊喜&#xff0c;它不仅仅是一个简单的租赁平台&#xff0c;更是生活中不可或缺的好帮手。想象一下&#xff0c;无论你缺少什么&#xff0c;从工具到家居用品&#xff0c;只需轻轻一点&#xff0c;便能轻松找到需要的物品。这个小…

springboot413福泰轴承股份有限公司进销存系统(论文+源码)_kaic

摘 要 使用旧方法对福泰轴承股份有限公司进销存系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在福泰轴承股份有限公司进销存系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不…

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…

C++作业3(类)

1、思维导图 2、类中存在引用成员情况下有参构造 #include <iostream>using namespace std; class Cy {float &r; public:Cy(float &r):r(r){cout<<"类中存在引用成员情况下有参构造"<<endl;};float set_r(float);void show(); }; float…

【开源】一款基于SpringBoot 的全开源充电桩平台

一、下载项目文件 下载源码项目文件口令&#xff1a;动作璆璜量子屏多好/~d1b8356ox2~:/复制口令后&#xff0c;进入夸克网盘app即可保存&#xff08;如果复制到夸克app没有跳转资源&#xff0c;可以复制粘贴口令到夸克app的搜索框也可以打开&#xff08;不用点搜索按钮&#…

定制链接类名,两类跳转传参,vue路由重定向,404,模式设置

router-link-exact-active 和 router -link-active两个类名都太长&#xff0c;可以在router路由对象中定制进行简化 // index.js// 路由的使用步骤 52 // 1.下载 v3.6.5 // 2.引入 // 3.安装注册Vue.use(Vue插件) // 4.创建路由对象 // 5.注入到new Vue中&#xff0c;建立关联…

鼠标右键单击Git Bash here不可用

最近在学习git时突然发现右键的git bash没反应&#xff0c;但是去点击应用图标就能正常运行&#xff0c;通常是因为你在安装git之后改变了它的目录名称或者位置&#xff0c;我就是因为安装后改变了一个文件夹的文件名导致不可用 在安装git时系统会默认给鼠标右键选项的git Bas…

探索Web3:从去中心化应用到全球数字化未来

Web3 是互联网发展的下一步&#xff0c;它通过去中心化的理念重新定义了数字世界。与传统的Web2相比&#xff0c;Web3将数据主权交还给用户&#xff0c;让每个人都可以在没有中介的情况下安全地交换信息和价值。本文将探索Web3的基本概念&#xff0c;去中心化应用&#xff08;D…

给我的小程序加了个丝滑的搜索功能,踩坑表情包长度问题

前言 最近在用自己的卡盒小程序的时候&#xff0c;发现卡片越来越多&#xff0c;有时候要找到某一张来看看笔记要找半天&#xff0c;于是自己做了一个搜索功能&#xff0c;先看效果&#xff1a; 怎么样&#xff0c;是不是还挺不错的&#xff0c;那么这篇文章就讲讲这样一个搜索…

HarmonyOS 线性容器List 常用的几个方法

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和LinkedList相比&#xff0c;LinkedList是双向链表&#xff0c;可以快速…

华为HarmonyOS NEXT 原生应用开发:页面路由、页面和组件生命周期函数

页面路由、组件生命周期 一、路由的基本使用 1. 如何新建页面 直接右键新建Page。【这个是最直接最常用的】新建普通ets文件&#xff0c;然后通过配置变成页面。 【该方法是遇到这种情况的解决方案】 2. 路由 - 页面之间的跳转 使用 **router.pushUrl&#xff08;{}&#xff…

二叉树概述

目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…

【从零开始入门unity游戏开发之——C#篇01】理论开篇

文章目录 前言前置条件什么是编程&#xff1f;什么是代码&#xff1f;什么是编程语言&#xff1f;常见的编程语言什么是C#&#xff1f;学习Unity为什么要先学习C#&#xff1f;选择适合自己的IDE集成开发环境VSCode安装和环境配置VSCode调试模式专栏推荐完结 前言 这个系列我想…

汽车总线协议分析-CAN总线

随着汽车工业的发展&#xff0c;汽车各系统的控制逐步向自动化和智能化转变&#xff0c;汽车电气系统变得日益复杂。许多车辆设计使用CAN、CAN-FD、LIN、FlexRay或SENT在电子控制单元(ECU)之间以及ECU与传感器&#xff0c;执行器和显示器之间进行通信。这些ECU之间的通信允许车…

SQL 获取今天的当月开始结束范围:

使用 GETDATE() 结合 DATEADD() 和 DATEDIFF() 函数来获取当前月的开始和结束时间范围。以下是实现当前月时间范围查询的 SQL&#xff1a; FDATE > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) FDATE < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) 1, 0) …

【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤

&#x1f399;告诉你&#xff1a;Java是世界上最美好的语言 &#x1f48e;比较擅长的领域&#xff1a;前端开发 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持续下去的动力&#xff01; 目录 一. 作者有话说 …

【OpenCV】图像转换

理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像&#xff0c;使用 2D离散傅里叶变换&#xff08;DFT&#xff09; 查找频域。快速算法称为 快速傅立叶变换&#xff08;FFT&#xff09; 用于计算DFT。 Numpy中的傅立叶变换 首先&#xff0c;我们将看到如何使用Numpy查…

集合ArrayList

黑马程序员Java的个人笔记 BV17F411T7Ao p111~p115 目录 集合存储数据类型的特点 创建对象 ArrayList 成员方法 .add 增加元素 .remove 删除元素 .set 修改元素 .get 查询元素 .size 获取长度 基本数据类型对应的包装类 Character 练习 返回多个数据 集合存储…

MVC基础——市场管理系统(三)Clean Architecture

文章目录 项目地址五、Clean Architecture5.1 user cage driven5.1.1创建CoreBusiness 5.2 创建UseCases5.2.1 创建CategoriesUseCases1. 创建VeiwCategoriesUseCase获取所有Cagegory 5.2.2. 实现ICategoryRepository接口3. 实现获取所有Category的方法4. 实现获取一个Cagegory…