linux 一次io大小,Linux——标准IO篇

主要知识点:

标准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'

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值