文件编程概念(C语言库函数系统调用API)

article/2025/5/19 4:20:48

文件编程(文件IO)

        文件编程就是操作文件,对文件进行打开,关闭,读、写等操作(个人理解)。之前C语言编写程序运行都是对键盘和显示器进行的,运行程序时会默认打开的三个文件 标准输入流  ( 键盘stdio)标准输出流 (终端显示器stdout) 、标准出错输出流(终端显示器stderr),程序运行相当于在对以上三个文件进行操作,而其他文件都需要通过程序手动打开才能进行访问。

1、计算机的一点哲学——一切皆是文件

        方便管理计算机资源,不用不同的类别用不同的方式管理,软硬件统一管理方式,减化用户对输入输出设备的操作,节约成本,减少内存。计算机把所有资源都抽象成文件VFS虚拟文件系统),操作系统以文件为单位对数据进行管理

2、文件分类 

四大类

        1/普通文件       -            C库函数和API主要操作对象

        2/目录文件       d

        3/设备文件      c/b

        4/链接文件       L

三小类

        5/管道文件       p

        6/套接字           s

        7/堆栈               f

3、API 用户编程接口(Linux系统提供

        用户通过API实现访问内核,对文件进行操作

4、文件编程IO分类

        初级IO (初级API)      标准IO(C库函数)        高级IO(高级API)

5、文件IO的重要

        一切皆是文件,对计算机而言文件操作的过程简单

6、文件系统

        操作系统对系统的软件资源(不论是应用软件和系统软件)的管理都以文件方式进行,承担这部分功能的操作系统称为文件系统。(如根目录系统)

7、文件描述符(系统调用API)&文件指针(C语言库函数)

        文件指针:C库函数提供(声明stdio.h),文件类型指针,一种结构体类型,存放文件的文件的有关信息,这些信息再打开一个文件时由系统根据文件的情况自动放入。C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括缓冲区和文件描述符。而文件描述符是文件描述符表的一个索引,也就是说C语言的文件指针是Linux系统中对文件描述符的一种封装

FEIL* fd        //定义一个指向文件的指针变量

fd=fopen("a1","r")//将fopen的返回值赋给指针变量fd

可以使fd指向一个文件的文件信息区(结构体变量),通过文件指针变量就能找到与它关联文件

        文件描述符:Linux系统中打开文件就会获得文件描述符,范围是0~1023,文件描述符是查找文件的一个索引,根据这个索引可以找到一个指针,已打开的指针指向FILE结构体。

特点:动态分配,打开分配,关闭收回

三个特殊的文件描述符: 0 stdio 1 stdout  2 stderr

文件描述符和文件指针的相互转换(C库提供fdopenfileno

 文件描述符复制(重定向dup&dup2)

dup

dup2    

注意:如果新的文件描述符已经打开,应该先把原来的文件描述符关掉 

8、缓冲区(C语言库函数才有)

1、什么是缓存区(为减少系统调用,读取文件时先把文件放到内存中,提高读写效率)

        缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做 缓冲区 。1缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。



2、为什么要引入缓冲区(协调CPU和文件读写速度不匹配的关系,提高读写效率

        从磁盘里取信息,先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。



3、缓冲区的类型

缓冲区 分为三种类型:全缓冲、行缓冲和不带缓冲。

        1.全缓冲 缓冲区全满输出
        2 .行缓冲 满一行输出
        3. 不带缓冲 实时输出

大部分系统默认使用下列类型的缓存:

(1)标准出错是不带缓存的。

(2)如果是涉及终端设备的流,则它们是行缓存的;否则是全缓存的。


        ANSI C对stdin、stdout和stderr的缓存特征没有强行的规定,以至于不同的系统可能有不同的stdin、stdout和stderr的缓存特征。目前主要的缓存特征是:stdin和stdout是行缓存;而stderr是无缓存的。 



4、缓冲区的大小

        如果我们没有自己设置缓冲区的话,系统会默认为标准输入输出设置一个缓冲区,这个缓冲区的大小通常是512个字节的大小。缓冲区大小由 stdio.h 头文件中的宏 BUFSIZ 定义,如果希望查看它的大小,包含头文件,直接输出它的值即可:

        printf(“%d”, BUFSIZ);

可以通过 setbuf函数和 stevbuf (重点)函数改变缓冲区大小




5、缓冲区的刷新

        (1)缓冲区满时;

        (2)行缓冲区遇到回车时;

        (3)关闭文件;

        (4)使用特定函数刷新缓冲区。

 https://blog.csdn.net/zhao2chen3/article/details/81707805?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E5%BA%93%E7%9A%84%E7%BC%93%E5%AD%98%E5%8C%BA&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-81707805.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187https://blog.csdn.net/zhao2chen3/article/details/81707805?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E5%BA%93%E7%9A%84%E7%BC%93%E5%AD%98%E5%8C%BA&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-81707805.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

9、映射(将文件映射到内存中,相对缓冲区读写效率更快mmap函数(重点) 和munmap)

         内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数

 

        使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O 操作,这意味着在对文件进行处理时将不必再为文件申请并分配缓存,所有的文件缓存操作均由系统直接管理(缓存是库函数外包管理的),由于取消了将文件数据加载到内存、数据从内存到文件的回写以及释放内存块等步骤,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

10、缓冲区和映射对比

        映射更快,处理方式不同,实现原理不同

11、阻塞和非阻塞

1、概念

a/阻塞:读某些文件时,如果文件没有数据的话,往往会导致读操作会阻塞(休眠),程序把cpu资源让出去,不执行该程序下面的内容,直到读写到内容,例:scanf必须输入才能继续运行

b/非阻塞:读某些文件时,如果文件没有数据的话,立即返回

c/普通文件一般不会阻塞,设备文件有阻塞

 2、如何选择阻塞非阻塞

        单一程序阻塞而运行,大型程序非阻塞运行

3、如何实现非阻塞读取

(1)打开文件时指定O_NONBLOCK状态标置

(2)通过fcntl函数(重点)追加O_NONBLOCK属性来实现

(3)理想方式     I/O多路复用 select poll epoll(重点) 异步IO

12、C库函数和API对比

      C库函数   库函数调用则是面向应用开发的,相当于应用程序的API

(1)有缓冲区     相比API处理普通文件更快,频繁操作大文件时,节约时间,读写效率高
(2)移植性好,可跨平台windows 和 Linux都能用

     API

(1)无缓冲区

(2)是操作系统提供,移植性差

(3)可以用来处理特殊文件 如:设备文件等



http://chatgpt.dhexx.cn/article/nxbgGWgh.shtml

相关文章

c语言库函数大全文库,C语言库函数源代码

C语言库函数源代码 C语言库函数源代码 strstr ( )/* -- C语言库函数源代码 - */ /* 得到s1中第一次包含s2字符串的位置指针。 */ #include stdlib.h char * my_strstr(const char *s1,const char *s2) { if (*s1 0) { if (*s2) return (char *) NULL; return (char *) s1; } …

C语言常用的库函数 (自用)

常用的库函数 1.前言2.内容1.toupper()2.tolower()3.sprintf()4.abs()5.fabs()6.labs()7.scanf()8.itoa() 3.小声bb4.更新日志 1.前言 在刷题过程中,总能看到dl用一些库函数,简化算法,由此萌生慢慢学习整理常用的库函数的想法,本…

c语言的库函数

一、标准C库函数(15个) 二、数学函数 用于求幂&#xff0c;计算平方跟&#xff0c;求绝对值。#include <math.h>绝对值函数用于表达式的结构转换为非负函数 int x-3; printf("|%d|%d\n",x,abs(x)); 三、字符串处理函数 四、字符处理函数 五、转换函数和存储管…

MySQL 远程访问失败的原因及解决方案

文章目录 1、失败的原因1.1、 /etc/mysql/my.cnf文件中bind-address 127.0.0.1没有注释掉1.2、 端口3306没有开放&#xff0c;使用 ss -tlnp 命令查看网络端口开启状态1.3、 在MySQL数据库user表中host字段值为localhost 2、解决方案2.1、/etc/mysql/my.cnf文件中&#xff0c;…

mysql5.7.6允许远程_mysql5.7 设置远程访问

mysql5.7设置远程访问不是和网上说的一样建个用户赋个权限就可以访问的。比如下边这个就是建用户赋权限&#xff0c;可能在之前的版本可以&#xff0c;但是我在我的mysql上一直不行。为此烦了好久&#xff01;&#xff01;&#xff01;项目都耽误了&#xff01;&#xff01; 一…

Mysql远程访问权限

在阅读本文时&#xff0c;推荐先走读完浅谈Mysql权限控制一文。 Mysql启动默认的端口3306是打开的&#xff0c;此时打开了mysqld的网络监听&#xff0c;允许用户远程通过账号密码连接本地数据库&#xff0c;Mysql数据库默认是允许远程用户连接服务器的。 那么&#xff0c;为什…

Mysql远程访问限制ip

一、Mysql允许指定IP远程访问 1、登录mysql -u root -p 之后输入密码进行登陆 2、查看用户表 首先要先指定使用mysql数据库&#xff0c;然后再进行查询操作//进入mysql数据库 mysql> use mysqlmyql> select Host,User from user;下面的列表就是查询user表后可以访问…

CentOS7 开启mysql远程访问

一.开启mysql的远程访问权限 可以先查看下表的内容 1.用mysql自带的客户端连接mysql mysql mysql -uroot -p 输入root用户的密码 进入mysql命令行模式 mysql >select user,host from mysql.user; 2.如果要直接使用root用户远程连接,直接执行以下sql 方法一: mysql>upda…

MySQL设置远程访问权限

当我们在日常开发中&#xff1b;需要连接其他同事的数据库或者其他服务器的数据库&#xff1b;可能会出现以下情况 我们输入的用户和密码都正确&#xff1b;但是提示我们用户没有权限&#xff1b;这个用户指的是远程连接的电脑ip没有访问权限&#xff1b;不是mysql的用户没有权…

Mysql允许远程访问

目录 远程访问条件配置1、配置绑定地址2、授权用户改表授权 远程访问条件 mysql允许远程访问有两个必要条件 外部能访问到mysql开启的端口用户有权限访问 配置 1、配置绑定地址 mysql配置绑定的地址是127.0.0.1&#xff0c;只允许本机连接。为使其他主机可以访问mysql服务…

授权MySQL可以远程访问

MySql-Server 出于安全方面考虑默认只允许本机(localhost, 127.0.0.1)来连接访问.要实现远程访问必须给root修改可以远程访问的权限。 授权步骤&#xff1a; 1.进入数据库连接mysql -u root -p&#xff1b; use mysql&#xff1b; 2.查询用户表命令&#xff1a;select User,au…

配置MySQL远程访问

如果通过数据库客户端Navicat等 远程连接 MySQL&#xff0c;出现了 2003 错误&#xff0c;说明服务器上的数据库没有配置远程连接。 因为MySQL默认是只允许本地连接的。 远程连接MYSQL必须完成下面的配置。 1. 授权远程用户登录 # 在服务器上进入MySQL控制台 $ mysql -u roo…

Ubuntu设置MySQL远程访问

文章目录 一、设置mysql远程访问 -> 第一种方式二、设置mysql远程访问 -> 第二种方式三、Windows上MySQL管理器下载与远程访问使用方法下载与安装使用 一、设置mysql远程访问 -> 第一种方式 编辑mysql配置文件&#xff0c;把其中bind-address 127.0.0.1注释了 sudo…

MySQL远程访问配置

MySQL远程访问配置 1. 进入MySQL安装目录下的bin目录&#xff08;如果配置过环境变量就直接到第二步&#xff09; 2. 在地址栏输入cmd打开命令行窗口&#xff08;如果配置过环境变量直接WinR输入cmd回车即可&#xff09; 3. 输入命令mysql -uroot -p回车&#xff0c;然后输入…

远程访问Mysql

1.远程虚拟机登上mysql客户端&#xff0c;show databases查看有哪些数据库&#xff0c;use mysql进入该数据库 show tables;查看表 select user,host from user;看host属性&#xff0c;root用户只能在本地访问数据库。 更改host, 执行 update user set host% where userroot…

MySQL远程连接的设置

与SQL Server类似&#xff0c;MySQL在需要远程操纵其他电脑时&#xff0c;也需要对其做远程连接的相应设置&#xff0c;具体操作如下。首先&#xff0c;我们需要解决不能远程访问的问题。在控制台命令中输入命令: mysql –uroot –p&#xff08;对应安装软件时设置的密码&#…

mysql远程访问

问题场景&#xff1a; windows局域网内访问mysql数据库 连接失败报10060 原因分析&#xff1a; 查阅了一些资料&#xff0c;问题出现在网络访问上。 mysql远程访问权限 mysql本身设定有访问权限&#xff0c;一般来讲安装的时候如果没有允许远程访问&#xff0c;非localhost…

Docker——四种网络模式解析

Docker四种网络模式解析 网络资源详解——Docker0网卡与四种网络模式Docker0网卡及四种网络模式host模式container模式none模式bridge模式网络模式的使用方法——指定模式和指定ip 网络资源详解——Docker0网卡与四种网络模式 安装完Docker时&#xff0c;会发现系统自动创建了…

Docker容器网络模式

目录 一、Docker网络实现原理 二、Docker的网络模式 1、Host模式 2、Container模式 3、none模式 4、bridger模式 bridge模式原理 5、overlay模式 6、自定义网络模式 为什么要自定义网络模式 创建自定义网络 删除docker网络 创建指定容器的ip 暴露端口 把宿主机文件传…

你应该学会的docker网络模式

学习Docker网络的七种模式 0. 双网卡1. the default Bridge2. User-defined 自定义桥接网络3. the Host3. MacVLAN3. the macVLAN&#xff08;802.1q&#xff09;4. the IPVlan (L2)5. the IPVlan (L3)6. Overlay7. None 0. 双网卡 Host: Linux vm 网卡&#xff1a;NATHost-on…