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

  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、文件描述符

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章