IO进程 学习笔记

news2025/2/27 23:14:54
……接上文

fputs(输入字符串)

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

文件指针偏移函数

1. rewind
void rewind(FILE *stream)
功能:将文件指针定位到文件开头
参数:流指针

2.ftell
long ftell(FILE *stream)
功能:计算文件指针当前的位置(相对于文件开头)
返回值:成功:返回当前文件指针相较于开头的字节数
        失败:-1
    
3.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:追加   
 返回值:成功:返回文件描述符
         失败:-1

rO_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,更新errno
    
struct 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.coloradmin.cn/o/2257916.html

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

相关文章

【Linux】系统安装内核后重启发现进不去系统

问题现象1 系统安装内核后重启发现进不去系统 问题排查步骤 进入pe模式或者livecd模式 使用mount挂载原系统/分区 chroot 刚挂载的/分区目录进入原系统 查询到发现内核存在安装失败 挂载/分区 在pe模式执行mount /分区 /mnt 使用 chroot 切换到你的环境&#xff1a; sudo …

重视猫艾滋:宠物健康的隐秘挑战

猫艾滋&#xff0c;全称为猫获得性免疫缺陷综合征&#xff08;Feline Acquired Immunodeficiency Syndrome&#xff09;&#xff0c;是由猫免疫缺陷病毒&#xff08;FIV&#xff09;感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似&#xff0c;但猫艾滋仅在…

python学习笔记—5—标识符和运算符

1. 标识符 &#xff08;1&#xff09;定义 用户在编程时所使用的一系列名字&#xff0c;用于给变量、类、方法等命名 &#xff08;2&#xff09;标识符命名规则 <1>内容限定 标识符的命名中只能由数字、英文、中文、下划线组成&#xff0c;其他都不被允许使用…

东方资产管理校招笔试测评题型题目深入解读

东方资管作为四大资产AMC公司之一&#xff0c;其薪资待遇还是不错的&#xff0c;现在为数不多还可以投递简历的金融央企。东方资产管理校招笔试一般在简历投递截止后的周末&#xff0c;总部和子公司、分公司需要分别做笔试。 东方资管笔试大概2h&#xff0c;线上双机位&#x…

Linux---对缓冲区的简单理解--第一个系统程序

前序&#xff1a; 首先先理解一下什么是回车与换行&#xff1b;回车和换行是两个概念&#xff0c;它们不是一个东西&#xff1b; 回车:光标回到开始&#xff1b;换行:换到下一行&#xff1b; 如下图&#xff1a; 行缓冲区 如何理解缓冲区问题&#xff1f; 可以认为&#xff0…

一文掌握 OpenGL 几何着色器的使用

学习本文需要具备 OpenGL ES 编程基础,如果看起来比较费劲,可以先看入门文章 OpenGL ES 3.0 从入门到精通系统性学习教程 。 什么是几何着色器 几何着色器(Geometry Shader) OpenGL 管线中的可选着色器阶段,位于顶点着色器(Vertex Shader) 和光栅化阶段 之间。 其核心…

Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

vite5+vue3+Ts5 开源图片预览器上线

images-viewer-vue3&#xff1a;一款Vue3的轻量级图像查看器&#xff0c;它基于Flip动画技术&#xff0c;支持PC和h5移动网页预览照片&#xff0c;如果它是Vue3开发的产品。 npm开源地址:https://www.npmjs.com/package/images-viewer-vue3?activeTabreadme Flip 动画 < …

再用RNN神经网络架构设计生成式语言模型

上一篇&#xff1a;《用谷歌经典ML方法方法来设计生成式人工智能语言模型》 序言&#xff1a;市场上所谓的开源大语言模型并不完全开源&#xff0c;通常只提供权重和少量工具&#xff0c;而架构、训练数据集、训练方法及代码等关键内容并未公开。因此&#xff0c;要真正掌握人…

阿里云轻量应用服务器开放端口,图文教程分享

阿里云轻量应用服务器如何开放端口&#xff1f;在轻量服务器管理控制台的防火墙中添加规则即可开通端口&#xff0c;开通80端口就填80&#xff0c;开通443就填443端口&#xff0c;开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…

微服务网关SpringCloudGateway、Kong比较

网关产品 1. Spring Cloud Gateway 基本信息 Spring Cloud Gateway是Spring Cloud生态系统中的一个组件&#xff0c;基于Spring 5、Project Reactor和Spring Boot 2构建。它旨在为微服务架构提供一种简单而有效的API网关解决方案。 功能特点 路由功能强大&#xff1a;使用Rou…

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题②

第十七届山东省职业院校技能大赛 中职组“网络安全”赛项资源任务书样题② 模块A 基础设施设置与安全加固(200分)A-1 登录安全加固&#xff08;Windows, Linux&#xff09;A-2 Nginx安全策略&#xff08;Linux&#xff09;A-3日志监控&#xff08;Windows&#xff09;A-4中间件…

运维实战:K8s 上的 Doris 高可用集群最佳实践

今天我们将深入探讨&#xff1a;&#xff1a;如何在 K8s 集群上部署 Compute storage coupled&#xff08;存算耦合&#xff09; 模式的 Doris 高可用集群&#xff1f; 本文&#xff0c;我将为您提供一份全面的实战指南&#xff0c;逐步引导您完成以下关键任务&#xff1a; 配…

【数据库】E-R模型、函数依赖、范式

2. 东方货运公司数据库的样本数据如下。 表名称&#xff1a;卡车 车号 货运站编号 类型 总行程 购入日期 1001 501 1 59002.7 11/06/2000 1002 502 2 54523.8 11/08/2000 1003 501 2 32116.6 09/29/2001 1004 502 2 3256.9 …

Socket编程-tcp

1. 前言 在tcp套接字编程这里&#xff0c;我们将完成两份代码&#xff0c;一份是基于tcp实现普通的对话&#xff0c;另一份加上业务&#xff0c;client输入要执行的命令&#xff0c;server将执行结果返回给client 2. tcp_echo_server 与udp类似&#xff0c;前两步&#xff1…

NRBO-BiTCN时序预测 | Matlab基于NRBO-BiTCN牛顿拉夫逊算法优化双向时间卷积网络时间序列预测

NRBO-BiTCN时序预测 | Matlab基于NRBO-BiTCN牛顿拉夫逊算法优化双向时间卷积网络时间序列预测 目录 NRBO-BiTCN时序预测 | Matlab基于NRBO-BiTCN牛顿拉夫逊算法优化双向时间卷积网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab基于NRBO-BiTCN时序…

基于大数据爬+数据可视化的民族服饰数据分析系统设计和实现(源码+论文+部署讲解等)

博主介绍&#xff1a;CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…

Bean的注入、单例和多例

目录 注入Bean对象 属性注入 构造注入 属性注入专题 注入集合/数组 级联简单类型赋值 Bean的单例和多例 注入Bean对象 简单类型使用value(除Date)&#xff0c;非简单类型使用ref 属性注入 name规则&#xff1a;必须提供set方法&#xff0c;去掉set&#xff0c;第一个字…

【Ubuntu】清理、压缩VirtualBox磁盘空间大小

1、说明 本人为虚拟机创建了两个硬盘:root.vdi 和 hoom.vdi,在创建虚拟机时,分别挂载在/root目录和/home目录下。 下面演示分别清理、压缩两个磁盘的空间。 2、清理空间 1)清理 root.vid sudo dd if=/dev/zero of=/EMPTY bs=1M;sudo rm -f /EMPTY输出信息中会提示,如…

计算生成报价单小程序系统开发方案

计算生成报价单小程序报价系统&#xff0c;是根据商品品牌、类型、型号、规格、芯数、特性、颜色、分类进行选择不同的参数进行生成报价单&#xff0c;要求报价单支持生成图片、pdf、excel表格。 计算生成报价单小程序系统的主要功能模块有&#xff1a; 1、在线生成报价单&…