5.10
标准IO
位于用户空间,是C库函数
是带缓存的IO操作----缓存的目的是提高程序的效率
FILE *:文件指针 指向内存中存放操作的文件信息的结构体
stream:流指针
文本流:操作数据是字符(ASCII)
二进制流:操作的数据是 0 1 二进制
全缓存:使用fflush、缓存区满、满足一定情况下
行缓存:遇见’\n’、fflush、缓存区满了,满足一定情况
典型的行缓存:stdout 标准输出流
无缓存:stderr
缓存类型设置的函数:setbuf
setbuf(stdout,NULL) :
关闭行缓存后会自动刷新(前面和后面的都会刷新出来)
fprintf
fprintf(FILE *fp,const char * format,…);
功能:将数据按照某种格式输出到指定的输出流中
sprintf
sprintf :项目中用于数据的组装
sprintf(char *s,const char *format,…);
功能:将数据按照某种格式输出到用户指定的缓冲区s中
snprintf
snprintf(char *s,size_t size,const char *format,…);
功能:数据按照某种格式,将前size个字节数据输出到 指定缓冲区中
fscanf
fscanf(FILE *fp,const char *format,…);
功能:将fp流中的数据 按照某种格式输入到 用户自定义的缓存中
sscanf
sscanf:项目中用于数据的拆解
sscanf(const char *s,const char *format,…);
功能:将缓冲区s中的数据 按照某种格式输入到 用户自定义的缓存中
打开或者创建文件,获得文件流指针
FILE *fopen(const char *path,const char *mode);
参数:
char buf[21]= “file.txt” ;可以传进一个数组
const char *p = “file.txt”;
path:待操作的文件名(包含路径)
mode:文件的操作方式(权限)r\r+ w\w+ a\a+
返回值:
成功:内存中存储文件信息的结构体首地址(文件指针)
失败:NULL,设置错误信息,perror
fclose
关闭文件流
int fclose(FILE *stream);
注意:
文件流被真正关闭之前,会自动刷新 流缓存。
一次读取一个字节的函数
int getc(FILE *stream);
int fgetc(FILE *stream);
功能:
从stream流中读取一个字节的数据,返回下一个字节。
注意:
1.getc 为宏函数;fgetc:为C库函数
2.两函数出错 和 文件流末尾都返回 EOF
feof(); 判断是否都到末尾
ferror();判断是否出错
3.当读取文件中一个字节数据时,磁盘文件的文件指针 将会向后偏移一个字节
一次写入一个字符的函数
int putc(int c,FILE *stream);
int fputc(int c,FILE *stream);
功能:
将c对应的字符,写入stream流中
返回值:
成功:返回写入的字符的ascii值
失败:返回EOF,并设置错误信息
注意:
putc 为宏函数;fputc:为C库函数
一次操作一行的函数(读一行、写一行)
char *fgets(char *s,int size,FILE *stream);
功能:
从stream中的一行读取前size个字节的数据到缓存区s
参数:
s:缓存区首地址
size:一行中读取的字节数
stream:指定的文件流
返回值:
成功:缓存区首地址
失败:NULL
文件末尾:NULL
注意:
1.fgets函数读取一行前size个字节数 >= 一行的真实数据长度,则遇见’\n’就结束返回
2.当size < 一行的真实数据长度,则实际读取size-1个数据,下一次将读取该行剩下的数据
使用fputs函数实现文件拷贝
int fputs(const char *s,FILE *stream);
一次操作一个结构数据
文本流:
一次操作一个文本的字符
二进制流:
一次操作一个结构体
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
功能:
从stream 流中 读取nmemb 个size大小的数据到ptr缓冲区
参数:
ptr : 缓冲区首地址
size:每个对象(结构体)的大小
nmemb :要读取的对象个数
stream : 流指针
返回值:
成功:实际读取的对象个数
失败:EOF,并设置错误信息
末尾:0
注意:
1.当读取的对象数,不满足整数时向下取整
size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
功能:
将 ptr缓冲区前 nmemb 个size大小的数据,写入 stream流中。
参数:
ptr:缓冲区首地址
size :每个对象(结构)的大小
nmemb :要写入的对象个数
stream : 流指针
返回值:
成功:实际写入的对象个数
失败:EOF,并设置错误信息
注意:
1、当写入的数据不足一个对象,向上取整。
文件内部指针的偏移、定位
int fseek(FILE *stream,long offset,int whence);
功能:
让 stream流中的指针 以whence为基准点 偏移offset个字节
参数:
stream:文件流指针
offset:偏移量
whence:基准点(SEEK_SET:文件头部起始位置 SEEK_CUR:文件当前位置 SEEK_END:文件尾部)
返回值:
成功:0
失败:-1 并设置错误信息
long ftell(FILE *stream);
功能:
定位 stream流中的指针位置
参数:
stream:文件流指针
返回值:
成功:文件指针在当前文件中的位置编号
失败:-1 并设置错误信息
文件IO
不带缓存的IO操作,是系统调用一部分
文件描述符:
内核向进程返回的编号,用来标识正在操作的文件
是系统最小的、未用的非负整数
所有文件IO操作,都通过文件描述符012进行
文件IO相关接口
1.int open(const char *path,int oflags);
功能:
以oflags方式打开path对应的文件,得到文件的文件描述符
头文件:
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
参数:
path:待操作的文件名(包含路径)
oflags:文件的打开方式(只读O_RDONLY,只写O_WRONLY,读写O_RDWR,不存在就创建O_CREAT,追加方式O_APPEND)
返回值:
成功:返回文件描述符
失败:返回-1.并设置错误信息
2.int open(const char *path,int oflags,mode_t mode);
功能:
以oflags方式打开path对应的文件,得到文件的文件描述符
头文件:
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
参数:
path:待操作的文件名(包含路径)
oflags:文件的打开方式(只读O_RDONLY,只写O_WRONLY,读写O_RDWR,不存在就创建O_CREAT,追加方式O_APPEND)
mode:文件的存根权限(八进制表示),该参数必须依赖O_CREAT才生效
返回值:
成功:返回文件描述符
失败:返回-1.并设置错误信息
gs,mode_t mode);
功能:
以oflags方式打开path对应的文件,得到文件的文件描述符
头文件:
#include <sys/types.h>
#include <fcntl.h>
#include <sys/stat.h>
参数:
path:待操作的文件名(包含路径)
oflags:文件的打开方式(只读O_RDONLY,只写O_WRONLY,读写O_RDWR,不存在就创建O_CREAT,追加方式O_APPEND)
mode:文件的存根权限(八进制表示),该参数必须依赖O_CREAT才生效
返回值:
成功:返回文件描述符
失败:返回-1.并设置错误信息