标准I/O(缓冲区文件操作)
一、文件描述
- 认识缓冲区:
-
一块内存区,在输入输出设备和CPU间,用来缓存数据。
-
读写操作都要经过缓冲区满足一定条件(遇到’\n’通过相关函数)后进行真正的写入和读出
-
标准输入/输出流:程序开始运行时,会有3个默认打开的文件标识符,
-
0:标准输入:stdin:STDIN_FILENO 系统分配为键盘
1:标准输出:stdout: STDOUT_FILENO 系统分配为显示器
2:标准错误:stderr: STERROR_FILONO 系统分配为显示器 -
fflush()//清理缓冲区的函数:fflush(stdin)、、ffush(stdout)
二、FILE指针
- 定义:
系统为打开文件建立的文件结构体,打开时返回来一个指针,程序通过指针获得文件信息,访问文件,关闭后,文件结构体被释放 - 形式
struct _iobuf
{
char *_ptr;//当前缓冲区内容指针
int _cnt;//缓冲区还有多少个字符
char *_base;//缓冲区的起始地址
int _flag;//文件流的状态,是否错误或者结束
int _file;//文件描述符
int _charbuf;//双字节缓冲,缓冲2个字节
int _bufsiz;//缓冲区大小
char *_tmpfname;//临时文件名
};
typedef struct _iobuf FILE;
三、打开关闭
fopen
- 原型:FILE * fopen(const char * path,const char * mode);
- 功能:打开由path指定的一个文件
- 头文件:#include<stdio.h>
- 参数:path:带路径的文件名
- mode打开方式:
-
r 打开只读文件,该文件必须存在。
-
r+ 打开可读写的文件,该文件必须存在。
-
rb+ 读写打开一个二进制文件,只允许读写数据。
-
rt+ 读写打开一个文本文件,允许读和写。
-
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
-
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
-
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
-
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
-
wb 只写打开或新建一个二进制文件;只允许写数据。
-
wb+ 读写打开或建立一个二进制文件,允许读和写。
-
wt+ 读写打开或着建立一个文本文件;允许读写。
-
at+ 读写打开一个文本文件,允许读或在文本末追加数据。
-
ab+ 读写打开一个二进制文件,允许读或在文件末追加数据。
- 返回值:
成功,返回操作文件的指针
失败,返回NULL
fclose
- 原型:int fclose(FILE *fp)
- 功能:关闭文件指针,释放资源
- 参数:fp: fopen返回的文件指针
- 返回值:
成功返回 0
失败返回 -1
四、单个字符读写
fputc
- 原型:int fputc(int c, FILE *stream)
- 头文件:#include <stdio.h>
- 功能:写一个字符到文件中
- 参数:
c:要写入的字符
stream:文件指针(要有可写权限) - 返回值:
成功:字符c
失败: EOF
fgetc - 原型:int fgetc(FILE *stream);
- 头文件:#include <stdio.h>
- 功能:从文件中读一个字符
- 参数:
5:要写入的字符
stream:文件指针(要有可写权限) - 返回值:
成功:返回读出的字符
失败: EOF
feof - 原型:int feof(FILE *stream);
- 头文件:#include <stdio.h>
- 功能:检查文件是否读取结束
- 参数: stream:指向待检查文件的指针
5:要写入的字符
stream:文件指针(要有可写权限) - 返回值:
文件未结束: 0
文件已结束: 1
五、字符串读写
fgets
- 原型:char * fgets(char * s, int size, FILE * fp);
- 头文件:#include <stdio.h>
- 功能:从fp指向的文件中读出一行(最多size-1个字符) 直到出现换行字符、读到文件尾或是已读了size-1 个字符为止,写入s指向的缓冲区。
- 参数:
s 保存读取到的字符
size 要读取的字符的个数
fp 为文件流指针 - 返回值:
取成功,返回读取到的字符串,失败NULL
fputs
- 原型:int fputs(const char *s, FILE *fp)
- 功能:将字符串s写入fp指向的文件中
3.参数
s:要写入文件的缓冲区指针
fp:要写入的目标文件的流指针
六、块读块写
fread
- 原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
- 头文件:#include <stdio.h>
- 功能:读文件
- 参数:
ptr: 要读入的缓冲区指针, 提前申请好的
size: 要读出的信息单元的大小 一般情况下, size设为1
nmemb:要读出的信息单元的个数, size* nmemb不大于ptr大小
fp: 要读的文件指针, 提前用fopen打开的
返回值:
成功:读取的信息单元的个数
失败: EOF
一般情况下, size设为1, nmemb设为想要读取
的字节数或者ptr指向buf 的大小,返回值为实际读
写的字节数。
fwrite
- 原型: size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);
- 头文件:#include <stdio.h>
- 功能:写文件
- 参数:
ptr: 要写入的缓冲区指针, 提前申请好的
size: 要写入的信息单元的大小 一般情况下, size设为1
nmemb:要写入的信息单元的个数, size* nmemb不大于ptr大小
fp: 要写的文件指针, 提前用fopen打开的 - 返回值:
成功:写入的信息单元的个数
失败: EOF
一般情况下, size设为1, nmemb设为想要读取
的字节数或者ptr指向buf 的大小,返回值为实际读
写的字节数。
七、格式化读写
fscanf(格式化输入)
- int fscanf ( FILE * fp, const char * format, … );
- fscanf从fp中格式化输入
-
fscanf(fd,"%s",buf);将fd所指向的文件里边的内容输入到buf中
- fscanf(fp,"%d %s",&c,d);从fp所指向的文件里边读取一个整数给c,在读取一个字符串给d
fprintf(格式化输出)
- int fprintf(FILE *fp, const char *format, …)
- fprintf格式化得到的字符串写到fp指向的文件里面
- 示例 fprintf(fd,"%s","what are you doing ");
sprintf(格式化字符串复制)
- int sprintf(char str, const charformat, …)
- 把某一种类型的数据转换成字符串存放到某一个地址内
- #include<stdio.h>
main()
{
char * a=”This is string A!”;
char buf[80];
sprintf(buf,” %s\n”,a);
printf(“%s”.buf);
}
八、文件指针定位
rewind
- void rewind(FILE *fp);
- 将读写指针定位到文件开始位置,无返回值
fseek
- 将读写指针定位到指定位置
- 参数
fp:要操作的文件
offset:偏移量(可正可负)
whence:参考位置
SEEK_SET //文件开始
SEEK_CUR //文件当前位置
SEEK_END //文件尾
ftell
- long ftell(FILE *fp);
- 返回当前文件读写指针的位置,常用来求文件的大小
- 操作定位内部的读写指针