文件编程(文件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库提供fdopen和fileno)

文件描述符复制(重定向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)可以用来处理特殊文件 如:设备文件等


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

  1. C语言库函数大全及应用实例三

    [编程资料]C语言库函数大全及应用实例三 函数名: ecvt 功 能: 把一个浮点数转换为字符串 用 法: char ecvt(double value, int ndigit, int *decpt ...

  2. C语言库函数大全及应用实例二

                                                 [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能: 直接使用BIOS服务的键盘接口 ...

  3. C语言库函数大全及应用实例七

    原文:C语言库函数大全及应用实例七 [编程资料]C语言库函数大全及应用实例七 函数名: getw 功 能: 从流中取一整数 用 法: int getw(FILE *strem); 程序例: <? ...

  4. C语言库函数大全及应用实例十四

    原文:C语言库函数大全及应用实例十四                                       [编程资料]C语言库函数大全及应用实例十四 函数名: strset 功 能: 将一个串 ...

  5. C语言库函数大全及应用实例四

                                      [编程资料]C语言库函数大全及应用实例四 couble fmod (double x, double y);<?xml:nam ...

  6. C语言库函数大全及应用实例六

    C语言库函数大全及应用实例六 原文:C语言库函数大全及应用实例六                                              [编程资料]C语言库函数大全及应用实例六 函 ...

  7. c语言中关闭文件的作用,【C语言】计算机中的流和文件概述(文件的概念及打开关闭)...

    [C语言]计算机中的流和文件概述(文件的概念及打开关闭) [C语言]计算机中的流和文件概述(文件的概念及打开关闭) 目录 一.计算机中流 二.文件 1.文件的概念 2.文件的分类 3.文件的缓冲区 4 ...

  8. C语言模块化开发,深入多文件编程

    目录 文章目录 目录 多文件编程 项目分割 避免命名冲突 项目生成的过程 预处理 编译 汇编 链接 语言发展的过程 机器语言 汇编语言 C语言 高级语言 编译的本质 目标文件里藏着什么 可执行文件 链 ...

  9. linux u8 头文件,2019-12-11 转载TCP/IP编程常用C语言头文件

    网络编程的头文件(这里所有的头文件都在/usr/include目录下面) 经常被一些头文件搞大,不知到到哪个头文件去找结构.这里做个总结 ---------------- 版权声明:本文为CSDN博主 ...

  10. linux判断文件写入完毕,linux文件编程——系统调用(打开、写入、读取、访问判断)...

    linux文件编程有两个方法:1.linux系统调用 2.C语言函数库 前者依赖的是linux系统,后者独立于操作系统而存在,不依赖于任何操作系统,因此,在不同的操作用使用C语言函数库的方法是一样的. ...

最新文章

  1. 针对抓win2003系统密码的诡计
  2. System V IPC
  3. java的注释、关键字、标识符、变量常量、数据类型、运算符、流程控制等
  4. IP归属地解析之离线纯真数据库分享
  5. HTML5 Notification实现浏览器通知
  6. w7计算机应用放大按键,设置Win7放大功能 老年人用电脑更方便
  7. 【Java练习】图书管理系统【详解篇15+完整代码】
  8. 设计原则3: 不要和陌生人说话.
  9. android吉他谱组件,Paranoid Android drum吉他谱
  10. Animation之闪烁的星星
  11. centos7克隆机修改ip地址,并与另一台虚拟机ping起来
  12. 2D转换 动画 3D转换
  13. 怎么在word文档里面的方框里打勾?
  14. java 成绩_java输出各种学生成绩
  15. 对与association和collection的理解:
  16. 全面解读信创行业 关注国产操作系统
  17. 人机对战的猜拳游戏,用户通过输 入(1.剪刀 2.石头 3.布),机器随机生成(1.剪刀 2.石头 3.布),胜者积分, n 局以后通过积分的多少判定胜负。
  18. 密码打马赛克已经不安全了!这款开源的去“马赛克”工具一秒还原
  19. scada如何用oracle数据库,SCADA系统数据库存储功能设计及应用
  20. 对云计算的理解和看法

热门文章

  1. 分享一段飞天R502读卡器的JAVA读卡代码
  2. DPDK-VPP 学习笔记-03 Load Balancer plugin
  3. PFQ: a Linux kernel module for packet capturing on multi-core architectures
  4. exfat文件系统相关数据结构以及数据恢复方法
  5. 无线接入控制服务器(ac),网络ac和ap是什么意思(图文)
  6. 临时表空间和数据表空间
  7. 解决安全频道支持出错,代码:80072F7D问题
  8. Flash制作空战游戏
  9. 网络工程师的python之路pdf下载_网络工程师的Python之路:网络运维自动化实战
  10. 计算机网络——数据链路层