fopen;打开文件
fread:对文件进行读操作
fwrite:对文件进行写操作
fseek:跳转文件读写指针位置
fclose:关闭文件,对应于fopen
std::in : 标准输入
std::out : 标注输出
stderr : 标准错误
fopen
FILE* fopen(char* filename, char* mode);
//filename是打开文件的名称
//mode是打开文件的方式
返回值是一个FILE*文件流指针, 通过这个指针操作文件
打开文件的方式有: r / r+ / w / w+ / a / a+ / b
r : 只读
r+ : 读写
w : 只写
w+ : 读写
a : 追加写
a+ : 追加读写
追加写 : 每次写入数据总是写入到文件末尾
b : 将文件以二进制操作的方式打开
其中, b要特别注意, 如果不指定b, 会默认文件为文本操作, 加上b才会认为是二进制操作; 其中的区别在于, 一个特殊字符只是一个字符, 但是文本操作的方式一个特殊字符可能占据两个字节的内存(这样假如我们去读取一个50字节的文件, 读取出来的大小可能就不是50字节了), 因此需要注意一下, 是否将文件以二进制操作方式打开.
fread 和 fwrite
size_t fread(char* buf, size_t block_size, size_t count, FILE* fp);
//buf : 一块接收缓冲区, 将从文件中读取到的数据放入buf缓冲区当中
//block_size : 块大小
//count : 块个数
//fp : 文件流指针
size_t fwrite(char* data, size_t block_size, size_t count, FILE* fp);
//data: 要写入文件的数据首地址
//block_size : 块大小
//count : 块个数
//fp : 文件流指针
fread 与 fwrite 的接口较为相似, 需要注意的是这个两个函数的返回值.
注意: fread 与 fwrite操作的数据实际上就是 块大小*块个数;
举例来说明, 假如块大小是10字节, 块个数是3, 那么我们实际上操作的数据长度就是 10*3=30字节.
返回值
fread与fwrite的返回值是实际操作的块个数
例如我们上面所举的例子, 块大小是10字节, 块个数是3, 意味着要读取/写入30字节的数据, 返回值就为3. 但是, 假如文件只有25字节, 不够30字节, 那么返回值就是2, 因为第3块没有读满.
正是因为这样, 我们通常会选择将块大小设置为1, 块个数设置为实际操作的数据长度.
fseek
int fseek(FLIE* fp, long offset, int whence);
//fp: 文件流指针
//offset / whence : 将文件的读写指针从whence的位置偏移offset个字节
whence
SEEK_SET : 文件开头
SEEK_END : 文件末尾
SEEK_CUR : 当前位置
注意: 文件中没有数据也可以跳转文件位置.
open : 打开文件
read : 对文件进行读操作
write : 对文件进行写操作
lseek : 跳转文件读写指针位置
close : 关闭文件
open
int open(char* filename, int flag, mode_t mode);
//filename : 要打开的文件名称
//flag : O_RDONLY 只读 / O_WRONLY 只写 / O_RDWR 读写
//当我们打开或者创建文件的时候, 至少要使用上述三个当中的一个
//除以之外, 还提供以下常量选用
//O_CREAT 文件不存在则创建
//O_EXCL 如果创建的文件已经存在, 直接报错返回-1
//O_TRUNC 文件存在, 并且以只写 / 读写方式打开, 会清空文件内容
//O_APPEND 每次写操作都会追加写至文件末尾
//mode : 如果使用了O_CREAT, 一定要通过该参数指定文件权限(mode & ~umask), 通常可以使用umask(0)将umask置0
返回值: 返回一个非负整数, 用来操作文件的操作句柄—文件描述符.
write
ssize_t write(int fd, char* data, size_t len);
//fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd向指定的文件写入数据)
//data : 要写入文件的数据首地址
//len : 要写入文件的数据长度
返回值 : 返回实际写入文件的数据长度, 错误返回-1
read
ssize_t read(int fd, char* buf, size_t len);
//fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd从指定的文件读取数据)
//buf : 一块缓冲区的首地址, 用来存放从文件读取到的数据.
//len : 想要读取的数据长度, 注意这个len不能大于buf缓冲区的大小
返回值 : 返回实际读取到的数据的长度, 错误返回-1
lseek
off_t lseek(int fd, off_t offset, int whence);
//fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd跳转指定的文件读写指针)
//offset : 偏移量
//whence : 从whence位置开始偏移
//类似于fseek
//SEEK_SET : 文件起始位置 / SEEK_CUR : 文件当前位置 / SEEK_END : 文件末尾