LInux下标准库IO接口和系统调用IO接口

标准库IO接口

fopen;打开文件
fread:对文件进行读操作
fwrite:对文件进行写操作
fseek:跳转文件读写指针位置
fclose:关闭文件,对应于fopen

std::in : 标准输入
std::out : 标注输出
stderr : 标准错误

  1. 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字节了), 因此需要注意一下, 是否将文件以二进制操作方式打开.

  1. 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, 块个数设置为实际操作的数据长度.

  1. fseek

     int fseek(FLIE* fp, long offset, int whence);
     //fp: 文件流指针
     //offset / whence : 将文件的读写指针从whence的位置偏移offset个字节
    

whence
SEEK_SET : 文件开头
SEEK_END : 文件末尾
SEEK_CUR : 当前位置

注意: 文件中没有数据也可以跳转文件位置.

系统调用IO接口

open : 打开文件
read : 对文件进行读操作
write : 对文件进行写操作
lseek : 跳转文件读写指针位置
close : 关闭文件

  1. 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
    

返回值: 返回一个非负整数, 用来操作文件的操作句柄—文件描述符.

  1. write

     ssize_t write(int fd, char* data, size_t len);
     //fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd向指定的文件写入数据)
     //data : 要写入文件的数据首地址
     //len : 要写入文件的数据长度
    

返回值 : 返回实际写入文件的数据长度, 错误返回-1

  1. read

     ssize_t read(int fd, char* buf, size_t len);
     //fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd从指定的文件读取数据)
     //buf : 一块缓冲区的首地址, 用来存放从文件读取到的数据.
     //len : 想要读取的数据长度, 注意这个len不能大于buf缓冲区的大小
     返回值 : 返回实际读取到的数据的长度, 错误返回-1
    
  2. lseek

     off_t lseek(int fd, off_t offset, int whence);
     //fd : 文件描述符(open打开文件返回的文件描述符, 通过这个fd跳转指定的文件读写指针)
     //offset : 偏移量
     //whence : 从whence位置开始偏移
     //类似于fseek
     //SEEK_SET : 文件起始位置 / SEEK_CUR : 文件当前位置 / SEEK_END : 文件末尾 
    

你可能感兴趣的:(linux,IO接口,基础IO,标准库IO,系统调用IO)