主要知识点:

标准IO(fopen、perror、fputc、fgetc,stdin、三种缓冲区、读写偏移、fseek、ftell、fgets、fputs)

[主要内容]

【1】IO

IO: input

output输入输出

IO:对文件的读写操作

IO: 标准IO、文件IO

标准IO:采用库函数的方式对文件进行读写操作(对文件的操作函数接口功能出自于库文件)

文件IO:采用系统调用的方式对文件进行读写操作(对文件的操作函数接口功能出自于内核)

缓冲区:在当前进程所占的内存空间的虚拟空间;

【系统调用:】

内核提供的接口层,应用程序可以通过此接口层实现内核为应用层提供的各种功能

系统调用的流程:

封装函数----》系统调用接口(软中断)-----》系统调用服务例程(编号)-----》内核函数(完成任务)

1)处理器的状态发生改变

用户态--内核态

表示处理器的执行级别,目的访问到内核进程的使用的内存

2)系统调用的编号

每一个系统调用的函数接口都会对应一个编号

/lib/modules/3.2.0-29-generic-pae/build/include/asm-generic

3)参数的传递

普通函数传参,通过将参数放到进程栈区实现;

在系统调用中,首先将函数使用的参数,放到cpu的寄存器,在执行内核函数之前,将参数从寄存器取出,放到内核进程的栈区

【2】标准IO

标准IO:

对文件进行访问操作时,内核此时建立缓冲区,当对文件进行读写操作时,先操作缓冲区,当缓冲区满足条件之后,再执行系统调用,由内核完成数据交互,减少系统调用的次数,提高执行效率。

标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。

FILE:

每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE

使用:先打开,后访问

《函数原型:FILE

*fopen(const

char *path, const char *mode);

功能:打开一个文件

参数:path 路径名或文件名

mode:

r

以只读的方式打开文件,如果文件不存在,报错;文件必须存在

r+

以读写的方式打开文件,如果文件不存在,报错;文件必须存在

w

以只写的方式打开文件,如果文件不存在,自动创建;如果文件存在,清空文件中原有的数据 (单个进程内是追加写)

w+

以读写的方式打开文件,如果文件不存在,自动创建;如果文件存在,清空文件中原有的数据

a

以只写的方式打开文件,如果文件不存在,自动创建;如果文件存在,将数据写入到文件末尾

a+

以读写的方式打开文件,如果文件不存在,自动创建;如果文件存在,追加到文件末尾

返回值:成功 流指针失败 NULL

《 函数原型:void

perror(const

char *s);

功能:打印系统错误消息

内核将函数执行出错之后所对应的错误码保存在变量errno,此函数根据变量errno中所保存的错误码,打印对应的错误消息

函数原型:char *strerror(int

errnum);

功能:返回错误码所对应的错误消息

参数:errno 变量

285 char*

_IO_buf_base; 缓冲区的开始地址

286 char*

_IO_buf_end; 缓冲区的结束地址

在对应的目录下建立索引:

1)进入到目录中

2)建立索引(sudo ctags -R)

3)vi -t + 关键词

4)追踪 ctrl + }

5)返回上一层 ctrl + t

【3】标准io对文件的操作

1)以字符、字符串的形式对文件进行读写

2)以数据单元的形式对文件进行读写

1)《函数原型:int

fputc(int

c,FILE *stream);

功能:向文件中写入一个字符

参数:c 写入的字符

stream 流指针

返回值:成功 写入的字符 ; 失败 EOF

注:如果c不是字符,会在插入的时候转换为字符;返回值是整形,如果不是则根据ASCII码转换成整形;判断条件:判断返回值是否是EOF

函数原型:int fgetc(FILE

*stream);

功能:从文件中读取一个字符

参数:stream 流指针

返回值:成功 读取的字符

失败 EOF

注:返回值是整形,如果不是则根据ASCII码转换成整形,输出用%c就行;

判断条件:判断返回值是否是EOF

标准I/O预定义3个流,他们可以自动地为进程所使用(访问终端、系统定义、FILE *型)

stdin 标准输入流指针 默认终端输入

stdout 标准输出流指针 默认终端输出

stderr 标准错误输出流指针 默认终端输出错误消息(打印错误的提示信息,

fprintf(stderr,"Userage

errpr: ./a.out + filename");)

实例:也可以利用main函数参数表里的参数传参;

fgetc(stdin)

从终端读取一个字符;

fputc(stdout) 从终端输出一个字符;

【4】缓冲区

1)全缓冲区--当流指针与文件相关联时,此时缓冲区是全缓冲区

(使用标准IO函数接口实现对文件进行操作,此时操作的缓冲区为全)

FILE *fp

=fopen("test.txt");

! 刷新条件:程序正常退出

缓冲区填满

强制刷新fflush(fp)

\n 换行

大小:4096 4K

2)行缓冲区--当流指针与终端相关联时,此时缓冲区是行缓冲区

(使用标准IO函数接口实现对终端的操作,此时操作的缓冲区为行)

stdin stdout

! 刷新条件:程序正常退出

缓冲区填满

强制刷新 fflush(fp)

‘\n’ (换行符)

大小:1024 1K

3)不缓冲区--没有缓冲区

stderr

大小: 0

【5】读写位置----读写偏移

读写位置的定位:

读写操作会引起fp的读写位置偏移

《 1.函数原型: int

fseek(FILE *stream, long offset, int whence);

功能:对文件读写位置定位

参数:

stream 流指针

offset 偏移量

相对于第三个参数再次发生的偏移

whence

SEEK_SET 定位到文件的开始处

SEEK_CUR

定位到文件的当前位置

SEEK_END

定位到文件的末尾处

返回值: 成功 0

失败 -1

《 2.

函数原型:long

ftell(FILE

*stream);

功能:获取当前的读写位置(从0开始)

获取当前读写位置相对于文件开始处的偏移量

返回值:成功 当前读写位置的值

失败 -1

【注意:】

当打开文件已a、a+的方式打开时,对该文件执行定位,定位操作成功,再次读写时,依然以文件的末尾处开始;当打开文件已w、w+的方式打开时,对该文件执行定位,定位操作成功,再次读写时,从当前定位开始,覆盖写;

【6】以字符串的形式对文件进行读写

《 函数原型:int

fputs(const

char *s, FILE *stream);

功能:写字符串到文件中

参数:s 写入的字符串

stream 流指针

返回值:成功 非负数

失败 EOF

《函数原型:char

*fgets(char

*s, int size, FILE *stream);

功能:

从文件中读取字符串-----------》(size足够大,保证一次能够处理一行) 常用来读取一行数据!

参数:s 保存读取的字符串

size 期望读取的字节数

stream 流指针

返回值:成功 读取的字符串

失败 NULL

注: 会自动追加‘\0’

=================================================================

无‘\n’换行符

当size >

文件中的数据的字节数,可以将数据全部读取,fgets在数据的末尾补'\0',表示字符串读取结束

size = 128 文件: hello

world

读取结果:hello

world'\0'

当size

<=文件中的数据的字节数,最多读取size-1个字符,fgets在数据的末尾补'\0',表示字符串读取结束

size = 9 文件:hello

world

读取结果:hello wo'\0'

==================================================================

有‘\n’

当size >

当前换行符‘\n’与上一次换行符‘\n’之间的数据的字节数,fgets遇到'\n',在‘\n’后补‘\0’,表示字符串到此执行结束

(size足够大,保证一次能够处理一行)

size = 128

文件:aaaaa'\n'bbbbb'\n'ccccc‘\n’

读取结果:1)aaaaa‘\n’'\0'

2)bbbbb'\n''\0'

3)ccccc‘\n’'\0'

当size <=

当前换行符‘\n’与上一次换行符‘\n’之间的数据的字节数,最多读取size-1个字符,fgets在数据的末尾补'\0',表示字符串读取结束

size = 5

文件:aaaaa'\n'bbbbb'\n'

读取结果:1)aaaa'\0'

2)a‘\n’'\0'

3)bbbb'\0'

4)b'\n''\0'

==================================================================

linux 一次io大小,Linux——标准IO篇相关推荐

  1. IO输入输出及标准IO函数

    [1]什么是IO #include <stdio.h> input:输入,从外部存储设备输入到内存中 output: 输出,从内存输出到外部存储设备. > 存储设备: > &g ...

  2. 如何查看linux系统的存储空间大小,linux 如何查看硬盘大小,存储空间大小等系统信息及硬件信息...

    一.linux CPU大小 [root@idc ~]# cat /proc/cpuinfo |grep "model name" && cat /proc/cpui ...

  3. linux 一次io大小,linux – AWS EBS中IO操作(IOP)的大小是多少?

    一个I / O操作的大小取决于很多事情.计算应用程序的平均值并不一定是个坏主意. 亚马逊对它们的定义意味着它们的硬件支持256KB块.单个I / O操作是读取或写入一个块.即使软件和硬件块大小匹配,对 ...

  4. linux lv在线缩小大小,Linux使用lvresize扩展或缩减lv大小

    环境:CentOS 6.7 一.新建并挂载目录 /u01 和 /data 1.创建目录挂节点/u01,/data mkdir -p /{u01,data} 2.创建lv,名称是lv_u01,大小10g ...

  5. linux看java堆大小,linux 改java堆内存大小

    linux 改java堆内存大小 [2021-02-08 23:06:29]  简介: linux查内存大小的方法:首先打开应用程序:然后选择系统工具选项,并单击系统终端选项:接着在系统终端命令行输入 ...

  6. linux统计某个目录大小,Linux下统计某个目录的文件个数(转)

    eclipse 建立maven项目 转自:http://www.cnblogs.com/candle806/p/3439469.html Eclipse+Maven创建webapp项目 1.开启ecl ...

  7. linux快速统计目录大小,linux下统计文件夹、文件的大小--du

    Linux下统计文件夹大小 du -sh ./ 统计文件夹占用的空间 find ./ -type f xargs ls -l awk 'BEGIN { size=0;}{size+=$5};END{p ...

  8. linux查看根目录的大小,linux下查看根目录或当前目录大小

    df 可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du 可以查看文件及文件夹的大小. 1.  df -h [www@idc01-xxxxx]$ df -h Filesy ...

  9. 查看linux设备Ran的大小,linux – 来自/ dev / zero和/ dev / urandom的不同文件大小

    dd status=progress if=/dev/zero of=/tmp/testfile.zer bs=100M count=10 dd status=progress if=/dev/ura ...

最新文章

  1. 斯坦福大学Christopher Manning:Transformer语言模型为什么能取得突破
  2. Qt之excel 操作使用说明
  3. Flutter开发之数据存储-3-数据库存储(34)
  4. Spring Cloud构建微服务架构:分布式配置中心(加密解密)
  5. Python—程序设计:抽象工厂模式
  6. python好学实用吗-都说python很简单 真的很好学么?
  7. sublime text3 添加到右键菜单
  8. Java中length,length(),size()的区别
  9. 清北学堂模拟赛d6t2 刀塔
  10. java读取图片成rgb二维数组
  11. ThinkPHP空操作及命名空间
  12. SecoClient 百度云安装包 亲测有效
  13. MT4跟单系统如何查询交易品种的合约规格?
  14. 苹果中国官网新增蚂蚁花呗 24 期分期免息服务
  15. 解决源码编译Python3后缺少ssl tkinter,bz2等库的问题
  16. 【C++】C++基础语法
  17. Android 底部导航栏-极致简单版
  18. Project2 分段切割路面,只取一个种子点
  19. 基于数字电路交通灯信号灯控制系统设计-基于单片机病房温度监测与呼叫系统设计-基于STM32的无线蓝牙心电监护仪系统设计-基于STM32的智能蓝牙温控风扇控制设计-基于STM32的智能温室控制系统设计
  20. 中国天气网免费天气预报接口API

热门文章

  1. 网络攻防之缓冲区溢出攻击
  2. vue3 + ts + pinia + vite + vueRouter4的基本配置和使用
  3. ORCL数据库导入/导出DMP常用命令
  4. 我想试试一篇把svm搞的清白
  5. 【python】获取三维图形的某个截面
  6. MBP NVM 全局管理npm配置
  7. AutoJs实战教程---京东极速版
  8. 不碰数据,又要建模?中国版FICO如何驾驭无数据场景 | 算力隐私专栏
  9. 洛谷 P8552 Rabbit
  10. storm详解与调优