标准IO
- 出现的原因:C语言标准委员会,为了统一编程接口
- Linux:y一切皆文件
- 标准IO为了减少磁盘的损耗,减少读写次数,对文件分配了输入输出两个缓冲区,struct FILE
- 缓冲区的大小(setbuf()设置):
- 全缓冲:默认情况
- 行缓冲:printf()
- 无缓冲:perror()
1 函数接口:
1.1 打开—->fopen()
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
- FILE *fopen(const char *path, const char *mode);
- path: 要打开的文件;
- mode: 以什么方式打开;
- r 以只读方式打开,如果没有该文件,则会报错,打开后,读指针在文件开头。
- r+ 以读写方式打开,其他与r方式相同。
- w 以只写方式打开,如果文件没有,则新创建。如果有,则会把原来内容清空,写指针在文件开头。
- w+ 以读写方式打开,其他与w相同
- a append的简写,追加打开,文件不存在,则创建。 打开后,读写指针在文件尾部
- a+ 与a相同,读指针在开头,写指针在尾部。
- 返回值:
- 正确:指向你打开的文件的FILE结构。
- 错误,NULL
- 下面三个文件系统会自动打开,直接用就可以:
- FILE *stdin
- FILE *stdout
- FILE *stderr
1.2 关闭—->fclose()
1.3 文件的读写
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
- ptr: 从stream文件里读到的信息存放到ptr为首地址的地方
- size:读数据的单位
- nmemb:读多少个上面的单位
- stream:从哪里读
- 返回值:真正读到多少个单位,而不是字节数!!!!
- 件stream的读指针向移动(返回值*单位大小)个字节
- size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
- ptr: 要将ptr为首地址的数据写入到stream文件
- size:要写数据的单位
- nmemb:写多少个上面的单位
- stream:写到哪里去
- 返回值:真正读到多少单位
- 文件stream的读指针向移动(返回值*单位大小)个字节
- int fgetc(FILE *stream);
- fuction:从文件中读取一个字符
- return:字符的ASCII
- 读指针:读出一个字符后,读指针自动往后跳一个
- int fputc(int c, FILE *stream);
- char *fgets(char *s, int size, FILE *stream);
- function:从stream流读的数据存放的位置。
- size:要读的大小
- stream:打开的文件
- 返回:fgets读完了数据后,会自动在s的尾部加换行符\n,会将stream的读指针挪到第二行
不会忽略空格
- int fputs(const char *s, FILE *stream);
1.4 判断文件是否结束feof()
- if/while(feof(fp)) 如果fp结束为真
- if/while(!feof(fp)) 如果fp没结束为真
- feof不太稳定,已经结束了,判断没结束
1.5 格式化
- int fscanf(FILE *stream, const char *format, …);
- function:从stream里按format的格式读出数据
- …:若干个读出来的数据项地址
- 返回值:真正读出的数据项的个数
- int sscanf(const char *str, const char *format, …);
- int fprintf(FILE *stream, const char *format, …);
- 将…的数据按format格式写入到文件stream中,不过这个函数不安全,容易越界
- int snprintf(char *str, size_t size, const char *format, …);
1.6 冲洗函数
- int fflush(FILE *stream);
- 如果stream是输入流,则丢弃stream的缓冲区
1.7 定位函数
- int fseek(FILE *stream, long offset, int whence);
- long ftell(FILE *stream);
- void rewind(FILE *stream);
- int fgetpos(FILE *stream, fpos_t *pos);
- int fsetpos(FILE *stream, const fpos_t *pos);