基础IO [文件的输入输出操作]

回顾标准库的IO接口 学习linux下系统调用IO接口 文件描述符的理解 重定向的理解 文件系统 库文件1、回顾标准库的IO接口 fopen / fread / fwrite / fseek / fclose stdin / stdout / stderrFILE *fopen(char *filename, char *mode);(文件名称,打开方式)打开方式:...
摘要由CSDN通过智能技术生成
  1. 回顾标准库的IO接口
  2. 学习linux下系统调用IO接口
  3. 文件描述符的理解
  4. 重定向的理解
  5. 文件系统
  6. 库文件

1、回顾标准库的IO接口

fopen / fread / fwrite / fseek / fclose            stdin / stdout / stderr

FILE *fopen(char *filename, char *mode);(文件名称,打开方式)

  • 打开方式:r-> 只读,r+ ->读写, w->只写, w+ ->读写, a->追加写(每次写入数据总是写入到文件末尾), a+ ->追加读写, b->二进制操作。
  • r+的读写与w+读写的区别:r+ 读写打开文件,若文件不存在则报错;w+ 读写打开文件,若不存在则创建,若存在清空原有内容。
  • a-> 不仅仅是追加写,文件不存在还会创建新文件。
  • b-> 默认清空,如果不指定b,则认为是文本操作,加上b则认为是二进制操作;区别在于-> 有时候一个特殊字符,只是一个字符但是占据两个字节的内存(读取一个100字节大小的文件,文本操作最终读取出来的数据,不一定是100个字节)。
  • 返回值:返回一个FILE*的文件流指针作为文件的操作句柄;失败返回NULL.

size_t fread(char *buf, size_t block_size, size_t block_count, FILE* fp); (缓冲区,块大小,块个数,文件流指针)

size_t fwrite(char *data, size_t block_size, size_t block_count, FILE* fp); (数据首地址,块大小,块个数,文件流指针)

  • note: fread/fwrite 操作的数据实际大小是块大小*块个数;块大小=10,块个数=2;意味着要写入/读取20个字节的数据;
  • 返回值:返回实际操作的块个数。 例如:读取一个文件size=10,count=2; 如果文件大小足够则返回2/但是若文件大小只有16字节,则会返回1,因为第二块没有读满。
  • fread 如果读到了文件末尾会返回0;若读取1000个字节,块个数为1,文件大小只有512字节,虽然读取了512的数据但是也会返回0.

int fseek(FILE *fp, long offset, int whence);(将文件的读写指针从whence位置偏移offset个字节)--> 跳转文件读写位置

int fclose(FILE *fp); 关闭文件流指针,释放资源。

    fread/fwrite比较推荐块大小为1,块个数是想要操作的数据长度;

    fseek:文件没有数据也可以跳转读写位置;

    对文件数据进行字符串操作的时候要注意文件数据中的\0 这种数据。

    标准库中的IO接口,都是库函数,而库函数是对系统调用接口的一层封装。

2. 系统调用接口

open / read / write / lseek / close

int open(char *filename, int flag, mode_t mode);

  • filename:要打开的文件名称
  • flag:选项参数--文件的打开方式  必选项/可选项
  • 必选项(只能选其一): O_RDONLY-只读 O_WRONLY-只写 O_RDWR-读写
  • 可选项:O_CREAT - 文件存在则打开,不存在则创建;O_EXCL 与 O_CREAT 同时使用,文件存在则报错,不存在则创建;O_TRUNC- 打开文件的同时清空原有内容;O_APPEND-追加写,总是将数据写入到文件末尾。
  • mode:权限--如果使用了O_CREAT有可能创建新文件,就一定要指定文件权限(mode & ~umask)---umask(0),八进制数字形式。
  • 返回值:一个非负整数--文件描述符--文件的操作句柄;失败返回-1;

ssize_ t write(int fd, char *buf,size_t count);

  • fd:open 返回的文件描述符--文件操作句柄
  • buf:要写入文件的数据的空间首地址
  • count:要写入的数据大小
  • 返回值:返回实际写入文件的数据字节长度;失败返回-1;

ssize_t read(int fd, char *buf, size_t len);

  • fd:open返回的文件描述符
  • buf:从文件中读取数据放到哪块缓冲区中的首地址
  • len:想要读取的数据长度,注意len不能大于缓冲区的大小
  • 返回值:返回的是实际读取到的数据字节长度,错误返回-1.

off_t lseek(int fd, off_t offset, int whence);

  • fd:open 返回的文件描述符
  • offset:偏移量
  • whence:从哪里开始偏移 SEEK_SET-文件起始位置  SEEK_CUR-文件当前读写位置  SEEK_END-文件末尾
  • 返回值:成功返回当前位置相对于起始位置的偏移量;失败返回-1;

int close(int fd); 通过文件描述符关闭文件,释放资源。

3、文件描述符

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值