本文主要介绍标准IO的相关概念、缓冲区、FILE指针和流、标准IO相关函数等,在linux中非常重要,对于基本概念理解后,对于标准IO的相关函数一定要进行代码验证,对于参数和返回值做以理解。
1.IO基本概念:
I:input
O:output
输入:从键盘将数据输入到内存中
输出:从内存将数据拷贝到显示屏上
scanf、printf的理解
输入:从文件将数据输入到内存中
输出:从内存将数据拷贝到文件中
2.文件相关概念:
文件:一组相关数据的有序集合(视频、音频等)
文件名:这个数据集合的名字
3.文件类型:
普通文件:
a--ASCII码文件(文本文件)
b--二进制文件(图片、视频等)
d--目录文件
l--链接文件
b--块设备文件
c--字符设备文件
p--管道文件
s--套接字文件(socket)
4.标准IO:
特点 :
1.既可以在windows下使用,也可以在linux下使用(可跨平台)
2.标准I/O库由ANSI C标准说明
3.有缓冲机制
4.通过文件流指针(FILE*)来操作
4.1 系统调用:
系统:操作系统
调用:调用函数
系统调用:操作系统提供给应用程序的接口(函数)
4.2 缓冲区
缓冲机制:减少系统调用的次数
全缓存:当缓冲区满,程序运行结束,强制刷新缓冲区时会刷新缓冲区
行缓存:当缓冲区满,程序运行结束,强制刷新缓冲区遇到换行符时会刷新缓冲区
不缓存:当程序运行起来后,有三个文件默认已经打开:标准输入,标准输出,标准出错,对应的流指针为:stdin,stdout,stderr
4.3 FILE指针
定义:每个被使用的文件都在内存中开辟一个区域,用来存放文件的相关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。
-->标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。
流:字节的进进出出(文本流、二进制流)
注:只有标准IO才有流的概念
文本流:----对应的ASCII码值
eg: 2 0 0 1 ---->50,48,48,49
二进制流:----十进制转二进制
eg:2001---->00000111 11010001
4.4 标准IO
1.文件操作步骤
打开文件----操作文件(读/写)----关闭文件
2.打开文件(open)
函数原型:FILE *fopen(const char *pathname, const char *mode);
函数功能:打开文件
参数1:要打开文件的路径
参数2:打开的方式
返回值:成功返回文件流指针(FILE*),失败返回NULL
注:打开的方式有很多,如:r表示以只读方式打开文件,文件不存在则出错,r+表示以可读的方式打开文件,文件不存在则出错,w表示以只写的方式打开文件,若文件存在则清空文件内容,不存在则创建......具体的可以查询一下
3.操作文件
3.1 按字符读写
输入:getchar()为从键盘进行输入,fgetc()既可以从键盘输入,也可以从文件中输入(读取)
输出:putchar()为输出到显示屏上,fputc()也可
int fgetc(FILE *stream);
函数功能:从指定的流中读取一个字符
参数:fopen的返回值,已经打开的文件流指针
返回值:成功返回读到的ASCII码值,读到文件末尾或者失败返回-1
int fputc(int c, FILE *stream);
函数功能:向指定的流中输出一个字符
参数1:要输出的字符
参数2:文件流指针
返回值:成功返回写入的ASCII码值,失败返回-1
int feof(FILE *stream);
函数功能:判断文件是否到达文件末尾
参数:要操作的流指针
返回值:如果非0表示到达文件末尾,如果为0表示没有到达文件末尾
注:feof既可以判断文本文件是否到达文件末尾,又可以判断二进制文件是否到达文件末尾
3.2按行读写
gets( )、puts( )
char *fgets(char *s, int size, FILE *stream);
函数功能:从指定的流中读取字符串
参数1:保存读取到的内容的首地址
参数2:空间的大小
参数3:要操作的文件流指针
返回值:成功返回读取到的内容的首地址,失败返回NULL
注:最多读取size-1个字符
fgets读取的时候会将换行符也读入
int fputs(const char *s, FILE *stream);
函数功能:向指定的流中输出字符串
参数1:要输出的内容的首地址
参数2:要操作的流指针
返回值:成功返回非负整数,失败返回-1
注:fgets和gets的区别----a、fgets比gets更安全;b、fgets会读取换行符,gets不会
fputs和puts的区别----a、puts会自动添加换行,puts不会
3.3 按块读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:按块读取内容
参数1:读到内容空间的首地址
参数2:块的大小
参数3:块的个数
参数4:文件流指针
返回值:成功返回读到的块数,失败返回-1
注:不够1个块的大小,按0处理;一般情况下,将size设置成1,返回值为实际读到的字节数
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
功能:向指定的流中写入数据
参数1:要写入数据的空间的首地址
参数2:块的大小
参数3:块的个数
参数4:要操作的文件流指针
返回值:成功返回写入的块数,失败返回-1
4.关闭文件
int fclose(FILE *stream);
参数:文件流指针,fopen的返回值
返回值:成功返回0,失败返回-1(EOF)
注:EOF只能判断是否到达文本文件的末尾,不能判断是否到达二进制文件的末尾
5.ftell
long ftell(FILE *stream);
函数功能:获取文件当前位置
参数:要操作的文件流指针
返回值:返回当前文件的指示
6.fseek
int fseek(FILE *stream, long offset, int whence);
参数1:要操作的流指针
参数2:偏移量
参数3:偏移的位置
SEEK_SET:文件的开头
SEEK_CUR:文件的当前位置
SEEK_END:文件末尾
----------------------------------------------------------------------------end--------------------------------------------------------
写在文末:下章我们对于文件IO进行学习!