第九章 输入输出——基于流的操作
来源:互联网 发布:美国超级计算机和知乎 编辑:程序博客网 时间: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); //打开临时文件,程序结束自动删除
- 第九章 输入输出——基于流的操作
- Java语言入门 -- 第九章 Java的输入输出操作
- Java语言入门 -- 第九章 Java的输入输出操作
- 第九章输入输出流1-4
- 第九周——时间类和输入输出运算符的重载
- 第九章输入输出流 第5题作业
- 基于缓冲字节输入输出流进行复制文件的操作
- shell脚本——输入输出的操作使用
- 输入输出流(IO)—文件字节流(FileInputStream & FileOutputStream)的基本操作及运用
- 输入输出流(IO)—文件字符流(FileReader & FileWriter)的基本操作及应用
- C++的输入输出流、文件操作
- C++的输入输出流、文件操作
- C++的输入输出流、文件操作
- C++输入输出流(文件的操作)
- JAVA输入输出流操作
- 输入输出流相关操作
- 输入输出流操作对象
- FFMPEG基于内存的转码实例——输入输出视频均在内存
- 语音编程
- 一个典型的内存泄露程序
- SQL Server JDBC驱动中sqljdbc和sqljdbc4区别
- 彻底领悟javascript中的exec与match方法
- SetRegistryKey的作用
- 第九章 输入输出——基于流的操作
- 动态链表初试
- 关于GUI中panel与Frame的一点小问题
- 【大话设计模式】——工厂模式家族
- 通过proc与内核交互
- C++const用法总结
- 用JSTL查询数据库
- jquery ajax
- 【推荐】【分享】开源力量公开课第十三期-beyond the web