声明:个人学习笔记,理解、记录可能有错误,转载请注明出处,保留本文所有权
在每个操作系统之中,对文件的管理与接口均有不同,例如Linux:open;Windows:WinOpen;
所以对同一个文件,在不同的操作系统都有不同的操作代码,所以对代码移植,跨平台运行是不可逾越的阻碍
能不能在诸多的操作系统之上构建出一个统一的文件操作接口呢???
为了实现这个目的,C语言标准委员会发布了一套横跨诸多系统的文件操作接口—标准IO
在标准IO之中用结构体 FILE 来表示一个文件,在结构体中创建了两个缓冲区
1)读缓冲区
2)写缓冲区
缓冲区:即一个暂存数据的内存,类似与寄存器的功能。
那么缓冲区里的数据到底多少的时候才会同步给用户呢??
1)行缓冲:
当数据达到一行时,同步到用户;
假如当前行缓冲区为80字节,那么当字节数达到80个字节或遇到换行符 \n 时,同步输出
eg:printf
main()
{
printf("This is test");
//printf("This is test \n");
while(1);
}
可以看到,加了\n和不加的区别,这就是行缓冲的奥妙
2)全缓冲:
缓冲区中数据填满了整个缓冲区时,数据才会同步
缓冲区的出现,提高了数据传输的速度,同样读取512字节,带缓冲只要一次,而无缓冲要512次。
但标准IO也有无缓冲模式
比如 perror(); 有一个字节就同步一个字节
标准io库,会为自动为每个进程,打开三个标准IO流(文件),
标准输入 : FILE *stdin
stdin是定义在
scanf(); 就是从文件stdin中去获取数据
标准输出: FILE *stdout
stdout是定义在
printf(); 就是把内容输出到stdout中去
标准出错: FILE *stderr
stderr是定义在
perror(); 不是把出错信息输出到stderr中去
#include
FILE *fopen(const char *path, const char *mode);
@path:指向要打开的文件文件名(带路径)
@mode :打开文件的方式
“r”: 只读打开。文件不存在,则报错。打开后,光标在开头。
“r+”: 读写打开。文件不存在,则报错。打开后,光标在开头。
“w”: 只写打开。文件不存在,则创建。打开后,文件内容截短(文件内容被清掉)光标在开头。
“w+”:读写打开。文件不存在,则创建。打开后,文件内容截短(文件内容被清掉)光标在开头。
“a”: append 追加打开,文件不存在,则创建。打开后,光标在末尾。
“a+”: 读写打开,文件不存在,则创建。原始读的位置在开头,原始写的位置在末尾。
返回值:
成功返回打开文件的指针 FILE* 后续标准IO库的函数都需要利用它来指定一个文件
失败返回NULL, errno被设置。errno:出错代码。它是在定义在 errno.h中的一个全局变量,表示上一个错误的代码。系统为每一个错误,指定一个出错的代码,
perror是用来把出错代码相应的解释字符串指针出来,
perror(“str”); -> 先输出用户的提示字符“str” 然后在输出 :错误误对应的解释字符串
#include
int fclose(FILE *stream);
关闭stream指向的文件
返回值:
成功返回0,失败返回非0;
#include
int fgetc(FILE *stream);
从stream文件之中读取下一个字符
返回值:
成功返回读取字符的ASCII码,失败返回-1,error被设置
int getc(FILE *stream);
功能同上,二者区别在于fgetc用函数实现,getc用宏实现
int getchar(void);
从标准输入文件上(键盘等输入设备)获取下一个字符
getchar() <=> fgetc(stdin)
#include
int fputc(int c, FILE *stream);
将指定的C输出到stream文件之中
返回值:
成功返回写入文件中的ASCII码,失败返回-1,error被设置
int putc(int c, FILE *stream);
与fputc的关系如getc与fgetc的关系相同
int putchar(int c);
将指定的C输出到标准输出文件(屏幕等输出设备)中
putchar© <=> fputc(c,stdout);
#include
char *gets(char *s);
将标准输入文件获取一行字符存取到s指定的内存中
返回值:
成功返回s的首地址,失败返回NULL,error被设置
gets有一个bug,gets没有考虑空间问题,存在越界问题!!!
故而fgets应运而生
char *fgets(char *s, int size, FILE *stream);
@ s : 指向的空间用来保存从文件中读取的数据
@ size :表示最多获取的字节数
fgets结束的情况:
1)遇到\n或文件结束
2)读取到size-1个字节,第size个字节自动补\0;
@ stream :表示从哪个文件中读取
后面还有 fputs、puts 不再赘述
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从stream指向的文件中读取一个数组(数组为N个,每个元素大小为size)到ptr指向的空间中
返回值:
成功返回实际读出文件的数组元素个数,失败返回-1,同时error被设置
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
将ptr指向的数组元素输出到ptr指向的空间中
返回值:
成功返回实际写入文件的数组元素个数,失败返回-1,同时error被设置