第九章 输入输出——基于流的操作

来源:互联网 发布:美国超级计算机和知乎 编辑:程序博客网 时间:2024/06/18 13:14
第九章、输入输出——基于流的操作
1、流简介
基于流的I/O操作通过一个指向文件的FILE指针来实现对文件的访问
文件和设备看作数据流
过程:
1)通过调用库函数fopen打开一个流,返回一个FILE结构指针,包含对所打开流进行操作的全部信息
2)执行程序时,有三个流自动打开,是标准输入、标准输出和标准错误输出,对应的结构指针stdin,stdout,stderr
3)流被打开后,可以进行I/O操作,同时会自动关闭
4)对一个流的操作完成后,执行清空缓冲区、保存数据等操作,将流关闭,调用fclose实现

2、基于流的I/O操作
FILE结构指针包含对流进行操作的各种信息,包括文件描述符、缓冲区指针、缓冲区大小以及出错标志
1)流的打开和关闭
建立流同某个特定的设备或文件之间的关联
FILE *fopen(const char *pathname, const char *type);
FILE *freopen(const char *pathname, const char *type, FILE *fp);
FILE *fdopen(int filedes, const char *type);
pathname表示文件名,type表示流的打开模式,fp是一个已有的FILE结构指针,filedes表示文件描述符
调用成功,返回FILE结构指针
int fclose(FILE *fp);
fp指向要关闭的流
如果没有关闭流,可能会造成数据停留在缓冲区,没有保存到文件,造成数据丢失!

2)缓冲区操作
①设置缓冲区属性
int setbuf(FILE *fp, char *buf);   //全缓冲或无缓冲
int setbuffer(FILE *fp, char *buf, size_t size);   //同上,可自行设置缓冲区大小
int setlinebuf(FILE *fp);   //行缓冲
int setvbuf(FILE *fp, char *buf, int mode, size_t size);   //mode指定缓冲区类型
全缓冲区:填满缓冲区,执行I/O,例磁盘文件
行缓冲区:遇到换行符,执行I/O,例标准输入输出,每行缓冲区固定大小,即使没有换行也执行
无缓冲区:不缓存。标准出错流stderr
②缓冲区的清洗
将I/O操作写入缓冲区的内容清空。可以丢掉,或保存到文件
int fflush(FILE *fp);   //将缓冲区数据强制写入到文件
int _fpurge(FILE *fp);   //将缓冲区数据清除

3)直接输入输出
以记录为单位直接进行读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *fp);
检查失败原因
int feof(FILE *fp);   //是否读到文件尾
int ferror(FILE *fp);   //是否出现读错误
重置结束标志和错误标志
void clearerr(FILE *fp);

4)格式化输入输出
实现格式化的输入输出
①格式化输出
int printf(const char *format, ...);   //输出到标准输出
int fprintf(FILE *fp, const char *format, ...);   //输出的指定流
int sprintf(char *str, const char *format, ...);   //输出到指定字符串
int snprintf(char *str, size_t size, const char *format, ...);   //可以处理缓冲区
format是一个字符串,用于描述输出格式,...表示可变参数,参数的个数和类型不定
返回实际输出的字符数
②格式化输入
int scanf(const char *format, ...);   //从标准输入流输入数据
int fscanf(FILE *fp, const char *format, ...);   //从指定流输入数据
int sscanf(char *str, const char *format, ...);   //从指定字符串输入数据
返回实际输入的字符数

5)基于字符和行的输入输出
①字符的输入输出
int fgetc(FILE *fp);
int getc(FILE *fp);
int getchar(void);   //只能标准输入
执行字符输入操作
int fputc(int c, FILE *fp);
int putc(int c, FILE *fp);
int putchar(int c);   //只能标准输出
执行字符输出操作
int ungetc(int c, FILE *fp);
②行的输入输出
char *fgets(char *str, int size, FILE *fp);   //size指定字符数,末尾加空字符表示结束,实际size-1
char *gets(char *str);   //只能标准输入
int *fputs(const char *str, FILE *fp);
int *puts(const char *str);   //只能标准输出

3、临时文件
char* tmpnam(char *str);   //生成有效的文件名
char* tempnam(const char *directory, const char *prefix);   //指定文件路径名和前缀
FILE* tmpfile(void);   //打开临时文件,程序结束自动删除
原创粉丝点击