标准I/O的基本概念
标准I/O操作建立在文件操作API的基础上,提供更高层次的文件操作功能
流
使用标准I/O库时,操作的是一个叫“流”的对象。在使用标准I/O访问文件时,系统内核返回流数据结构,所有后续操作都是对这个数据结构进行的。在文件操作中,这个流结构实际是一个指向FILE结构的指针。FILE结构保存了标准I/O库用于文件操作的相关信息。
缓存
在进行文件I/O操作时,对数据的读写并不直接对文件系统进行,而是对缓存进行,缓存在第一次调用标准I/O库进行I/O操作时,由系统自动调用malloc分配。标准I/O提供缓存的方式主要有一下三种:
- 全缓存:被填满才向文件系统刷新
- 行缓存:输入/输出过程中遇到换行符,向文件系统刷新
- 不缓存:不设置缓存机制
缓存的刷新除了系统自动进行外,也可以随时调用fflush系统调用手工刷新缓存。
可以在程序中改变默认缓存方式,标准I/O库提供为此提供了几个函数:setbuffer、setbuf、setlinebuf、setvbuf.
原型如下:
#include<stdio.h>
void setbuf(FILE*_restrict_stream,char*_restrict_buf);//缓冲区大小固定为BUFSIZ
void setbuffer(FILE*_restrict_stream,char*_restrict_buf,size_t_size);
void setlinebuf(FILE*_stream);
int setvbuf(FILE*_restrict_stream,char*_restrict_buf,int_modes,size_t_size);
无缓存模式,调用setbuf(stream,NULL)即可。
标准输入、标准输出以及标准错误输出
为了跟踪错误对错误进行留迹处理,有时需要将错误输出信息保存到文件中。Linux中进行输入重定向的符号”<”,输出重定向的符号”>>”和”>”。”>>”采取的是附加的方式。
使用标准I/O进行文件操作
打开关闭流文件
#include<stdio.h>
FILE*fopen(_const char*_restrict_filename,_const char*_restrict_modes);
int close(FILE*_stream);
单字符读写
#include<stdio.h>
int fgetc(FILE*_stream);
int getc(FILE*_stream);
int fputc(int_c,FILE*_stream);
int putc(int_c,FILE*_stream);
int getchar(void);
int putchar(int _c);
getchar等价于getc(stdin),putchar等价于putc(c,stdout).
行方式读写
#include<stdio.h>
char*fgets(char*_restrict_s,int_n,FILE*_restrict_stream);
int fputs(_const char*_restrict_s,FILE*_restrict_restream);
_s:缓冲区;_n:流中读取的长度;_stream:流指针。
标准输入输出库还提供了两个函数用于想标准输入/输出写或读
#include<stdio.h>
char*gets(char*_s);
int puts(_const char*_s);
puts会向标准输出写入数据后,附加一个换行符。gets从标准输入读取一行后,并未对缓冲区_s的长度是否足够进行检查。
二进制方式读写
如果文件内容按照一定的方式存放,如果用行读写的话,读取到的数据就无法恢复原样,为此,标准I/O库提供了二进制读写方式。
#include<stdio.h>
size_t fread(void*_restrict_ptr,size_t_size,size_t_n,FILE*_restrict_stream);
size_t fwrite(_const void*_restrict_ptr,size_t _size,size_t_n,FILE*_restrict_s);//读取的记录个数
格式化输入/输出
#include<stdio.h>
int printf(_const char*_restrict_format,...);
int fprintf(FILE*_restrict_stream,_const char*_restrict_format,...);
int sprintf(char*_restrict_s,_const char*_restrict_format,...);
int scanf(_const char*_restrict_format,...);
int fscanf(FILE*_restrict_restream,_const char*_restrict_format,...);
int sscanf(_const char*_restrict_s,_const char*_restrict_format,...);
_format:指定输入输出的格式串。
在流文件中定位
#include<stdio.h>
int fseek(FILE*_stream,long int_off,int _whence);//定位文件读写指针
long int ftell(FILE*_stream);//获取文件当前读写指针
void rewind(FILE*_stream);//定位文件指针到文件头
参考文献《Linux编程从入门到精通》