基础IO -- Linux与标准库下的文件IO操作

前言

在进行Linux的学习过程中,我们会接触到一系列与IO操作相关的函数。一般而言,我们将其分为三类,分别是:
文件IO、标准IO和库函数。
其中,文件IO顾名思义便是对文件进行操作的函数,再加上在Linux系统中,一切皆文件,所以当我们在之后的时间内进行更加深入的学习之后,文件IO的操作函数将会使用的越来越多。所以,今天,我们首先从将从常见的文件IO函数开始进行学习。

标准库的文件IO接口

代码举例

首先来看下面一段代码,我们用fopen打开文件然后进行写操作,完毕之后fclose关闭文件。文件IO操作的一般流程就是这样。

#include <stdio.h>
#include <string.h>
int main()
{
 FILE *fp = fopen("myfile", "w");
 if(!fp){
 printf("fopen error!\n");
 }
 const char *msg = "hello bit!\n";
 int count = 5;
 while(count--){
 fwrite(msg, strlen(msg), 1, fp);
 }
 fclose(fp);
 return 0;
}

库函数

FILE *fopen(char *filename,char mode);

返回值:返回一个文件流指针作为文件操作句柄。
参数一:需要打开的文件名称
参数二:打开方式

打开方式就是以某种方式打开文件,有以下几种:
r只读 r+读写 w只写 w+读写 a追加写 a+追加读写 b二进制操作

  • r+与w+区别: r+读写打开文件,文件不存在则报错,w+文件不存在则创建,存在则清空原有内容。
  • a: a不仅仅是追加写,文件不存在还会创建。
  • b:针对于某些需要进行二进制操作的时候使用,比如按照字节读取。
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);

作用:对文件进行读写操作。
参数一:缓冲区/数据首地址
参数二:块大小
参数三:块个数
参数四:文件流指针

块大小*块个数为操作的字节数。

返回值:一般返回实际操作的块个数。
注意: fread读取完缓冲取会返回0;

int fseek(FILE *fp, long offset, int whence);

作用:跳转文件读写位置。将文件读写指针从whence位置偏移offset个字节。
返回值:偏移的字节数
参数一:文件流指针
参数二:偏移的字节数
参数三:读写指针的起始位置

int fclose(FILE *fp);

作用:关闭读写指针释放资源。

系统调用IO接口

库函数封装了系统调用io接口,因此使用库函数会使我们的编程更加方便。但是系统调用接口我们也应该了解,这样才能对文件IO有更加深刻的理解。
我们对open/read/write/lseek/close这几个接口进行讲解。作用与库函数基本相同不加赘述。

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

参数一:要打开的文件名称
参数二:文件的打开方式,有以下几种

  • 必选项:O_RDONLY只读 O_WRONLY只写 O_RDWR读写
  • 可选项:O_CREAT文件存在打开不存在创建 O_EXCL与O_CREAT一起使用,存在报错不存在创建 O_TRUNC打开文件同时清空原有数据 O_APPEND将数据写到文件末尾

参数三:当文件不存在创建之后,需要设置创建文件的权限,mode&(~umask)或者直接umask(0).

返回值:返回文件描述符, 失败返回-1.

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

参数一:文件描述符
参数二:数据/缓冲取首地址
参数三:读取/写入数据的长度
返回值:返回成功读取/写入的数据长度,失败返回-1.

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

参数一:文件描述符
参数二:偏移量
参数三:从哪里开始偏移,SEEK_SET起始位置/SEEK_CUR当前读写位置/SEEK_END文件末尾.
返回值:返回当前位置相对于起始位置的偏移量,失败返回-1.

int close(int fd);

关闭文件描述符释放资源。

猜你喜欢

转载自blog.csdn.net/ifwecande/article/details/107435616