标准IO(介绍以及学习)

目录

什么是标准IO?

特点

缓冲机制

全缓冲

行缓冲

不缓冲

关于标准IO的函数接口

对文件操作

打开文件

关闭文件

读写操作

定位操作


什么是标准IO?

C库中定义的一组专门用于输入输出的函数,也就是存在于函数包或者“stdio.h”里面定义的,可移植性强

特点

1.通过缓冲机制减少系统调用,提高效率(至于什么是缓冲机制,会在下面进行补充)

2.围绕进行操作,流用FILE *来描述

3. 标准IO默认打开了三个流,stdin(标准输入)、stdout(标准输出)、stderr(标准错误)

4.一般只操作普通文件

什么是缓冲机制

看上图,我们首先需要了解,如果没有缓冲区,假如我们应用层需要和硬件进行交互,假如需要取1000个数据,而我们每次最多拿10个数据,我们需要拿一百次,也就是调用100次接口。而有了缓冲区,我们可以一次拿1000个数据,只需要调用一次接口,应用层只需要从缓冲区拿数据即可。

缓冲区,正是应用层进行系统调用之前,封装的一块区域

什么是流

我在这里,只能用我自己的方法对流进行解释说明,便于理解:

流是一个抽象的概念,当程序读取数据时,就会开启一个通往数据源的流,这个数据源可以是文件、内存或者是网络链接;当程序写入数据时,就会开启一个通往目的地的流。

也可以把计算机之间的数据传输想象成河流,一个个二进制就是水,不停的在流淌。

缓冲机制

缓冲可以分成行缓冲全缓冲,还有不缓冲

全缓冲

全缓冲和文件相关

刷新缓冲条件:

               1.程序正常结束:return(main)、exit

               2.缓冲区满刷新

               3.fclose关闭对应的流

               4.强制刷新:fflush

行缓冲

行缓冲:跟终端相关

刷新缓冲条件:

                  1     \n

                  2     程序正常结束:return(main)、exit

                  3    缓冲区满刷新

                  4   fclose关闭对应的流

                  5    强制刷新:fflush

注意:当遇到阻塞输入函数时,输出缓存区会刷新

比如:scanf

不缓冲

不缓冲:没有缓冲区,标准错误

关于标准IO的函数接口

对文件操作

打开文件

FILE *fopen(const char *path, const char *mode)

功能:打开文件

参数:

    path:打开的文件

    mode:打开的方式

        r:只读,当文件不存在时报错,文件流定位到文件开头

        r+:可读可写,当文件不存在时报错,文件流定位到文件开头

        w:只写,文件不存在创建,存在清空

        w+:可读可写,文件不存在创建,存在清空

        a:追加(在末尾写),文件不存在创建,存在追加,文件流定位到文件末尾

        a+:读和追加,文件不存在创建,存在追加,读文件流定位到文件开头,写文件流定位到文件末尾

    注:当a的方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置

返回值:成功:文件流

      失败:NULL,并且会设置错误码

FILE *freopen(const char *pathname, const char *mode, FILE* fp)

功能:将指定的文件流重定向到打开的文件中

参数:path:文件路径

mode:打开文件的方式(同fopen)

      fp:文件流指针

返回值:成功:返回文件流指针

      失败:NULL

关闭文件

int fclose(FILE* stream);

功能:关闭文件

参数:stream:文件流

读写操作

//每次读写一个字符

int fgetc(FILE * stream)

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

参数:stream:文件流

返回值:成功:读到的字符

      失败或读到文件末尾:EOF(-1)

int fputc(int c, FILE * stream)

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

参数:c:要写的字符

   stream:文件流

返回值:成功:写的字符的ASCII

      失败:EOF

//每次读写一串内容

char * fgets(char *s, int size,  FILE * stream);

功能:从文件中每次读取一行字符串

参数:s:存放字符串的地址

         size:一次读取的字符个数         

         stream:文件流

 返回值:成功:s的地址

       失败或读到文件末尾:NULL

特性:每次实际读取的字符个数为size-1个,会在末尾自动添加\0

       每次读一行,遇到\n后不再继续,读下一行

int fputs(const char *s,  FILE * stream);

功能:向文件中写字符串

参数:s:要写的内容

        stream:文件流

返回值:成功:非负整数

       失败:EOF

//二进制读写

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从文件流读取多个元素

参数:  ptr :用来存放读取元素

              size :元素大小  sizeof(数据类型)

 nmemb :读取元素的个数

    stream :要读取的文件

返回值:成功:读取的元素的个数;

            读到文件尾: 0

              失败: -1

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:按对象写

参数:同上

返回值:成功:写的元素个数

              失败 :-1

定位操作

int feof(FILE * stream);

功能:判断文件有没有到结尾

返回:到达文件末尾,返回非零值

int ferror(FILE * stream);

功能:检测文件有没有出错

返回:文件出错,返回非零值

 

void rewind(FILE *stream);

功能:将文件位置指针定位到起始位置

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

功能:文件的定位操作

参数:stream:文件流

     offset:偏移量:正数表示向后文件尾部偏移,负数表示向文件开头偏移

     whence:相对位置:

SEEK_SET:相对于文件开头

SEEK_CUR:相对于文件当前位置

SEEK_END:相对于文件末尾

返回值:成功:0

        失败:-1

注:当打开文件的方式为a或a+时,fseek不起作用              

long ftell(FILE *stream);

功能:获取当前的文件位置

参数:要检测的文件流

返回值:成功:当前的文件位置,出错:-1

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花田里的泪光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值