Linux 常用的IO接口

标准库IO接口

fopen

函数原型:FILE *fopen(char *filename, char *mode)参数内容(文件名称,打开方式)
功能:打开一个文件
打开方式常用的有7种
r 以只读的方式打开文件
r+ 以读写的方式打开文件,若文件不存在则会报错
w 以只写的方式打开文件
w+ 以读写的方式打开文件,若文件不存在则创建,文件存在就清空原有内容
a 以追加写的方式打开文件,文件不存在会创建新的文件
a+ 以追加读写的方式打开,文件不存在会创建新的文件
b 以二进制操作方式打开文件;默认情况下不指定b,则认为文件是文本操作,加上b就认为是以二进制操作文件;区别在于有时候一个特殊的字符会占用两个字节的内存,如果以文本操作方式读取文件,不一定能将所有数据正确读出。所以我们平时最好是加上b
该函数的返回值:返回一个FILE*文件流指针为文件的操作句柄;失败返回NULL

fread 和 fwrite

fread函数原型:size_t fread(char *buf, size_t block_size, size_t block_count, FILE* fp) 参数内容(缓冲区,块大小,块个数,文件流指针)
功能:读取一个文件内容

fwrite函数原型:size_t fwrite(char *data, size_t block_size, size_t block_count, FILE* fp) 参数内容(数据首地址,块大小,块个数,文件流指针)
功能:将数据写到文件中

这两个函数的返回值:都是返回实际操作的块个数,例如要读取一个文件块大小size=10,块个数count=,1;但是文件大小只有8个字节,则会返回0,因为第二个块没读完。如果fread读到了文件末尾也会返回0。所以这两个函数推荐块大小为1,块个数为想要操作的数据长度。这样子就不会出现读到数据依然返回0的情况

对文件数据进行字符串操作时要注意文件数据的\0

fseek

函数原型:int fseek(FILE *fp, long offset, int whence) 参数内容(文件流指针,偏移大小,偏移起始位置)
偏移大小实参:负数-向前偏移;正数-向后偏移;0-不偏移
偏移起始位置:SEEK_SET从文件起始位置偏移;SEEK_CUR从当前读写位置开始偏移;SEEK_END从文件末尾偏移
功能:将文件流指针从whence位置偏移offset个字节,跳转文件读写的位置,文件没有数据也可以跳转,前面置空

fclose

函数原型:int fclose(FILE *FP) 参数内容(文件流指针)
功能:关闭文件流指针,释放资源

以上函数用法代码示例:

 int main()
 {
     FILE *fp = NULL;
     //以读写的方式打开当前路径下的test.txt文件
     fp = fopen("./test.txt", "r+");
     if (fp == NULL)
     {
         perror("fopen error");
         return -1;
     }
 
 	 //将fp文件流指针偏移置文件末尾
     fseek(fp, 0, SEEK_END);
 
     char *ptr = "WhiteShirtI very cool\n";
     //将ptr的内容写到fp文件流指针所指位置
     int ret = fwrite(ptr, strlen(ptr), 1, fp);
     if (ret == 0)
     {
         perror("fwite error");
         return -1;
     }
     printf("write ret:%d\n", ret);
 
 	 //将fp文件流指针偏移置文件的起始位置
     fseek(fp, 0, SEEK_SET);
     char tmp[1024] = { 0 };
     //将读取到的数据写到tmp中
     ret = fread(tmp, 1, 1023, fp);
     if (ret == 0)
     {
         printf("have no data or error\n");
     }
     printf("ret:%d-[%s]\n", ret, tmp);
     //关闭文件并释放资源
     fclose(fp);
     return 0;
 }

系统调用IO接口

open

函数原型:int open(char *filename, int flag, mode_t mode) 参数内容(文件名, 选项参数-文件打开方式, 权限)
flag参数有必选项和可选项
必选项:O_RDONLY-只读; O_WRONLY-只写; O_RDWR-读写
可选项:O_CREAT-文件存在则打开,不存在则创建;O_EXCL-与O_CREAT同时使用,文件存在则报错,不存在创建; O_TRUNC-打开文件的同时清空原有内容; O_APPEND-追加写,总是将文件写到末尾
两个选项之间用|隔开

mode:如果使用了O_CREAT有可能创建新文件,就一定要指定文件权限,最终文件的权限为(mode & ~默认权限)例如mode=777,默认权限002,则文件权限为777 & ~002=775
返回值:一个非负整数–文件描述符–文件的操作句柄;失败返回-1
在这里插入图片描述

write

函数原型:ssize_t write(int fd, const char *buf, size_t count);参数内容(open返回的文件描述符,要写入文件的数据空间首地址,数据大小)
返回值:返回实际写入文件的数据字节长度;失败返回-1
在这里插入图片描述
在这里插入图片描述

read

ssize_t read(int fd, void *buf, size_t count); 参数内容(文件描述符,将读取的数据读到buf中, 读取的字节数)
返回值:返回实际读入的字节数,如果读取失败返回-1
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

lseek

off_t lseek(int fd, off_t offset, int whence) 参数内容(open返回的文件描述符,偏移量,偏移起始位置)
whence:SEEK_SET-文件起始位置;SEEK_CUR-文件当前读写位置;SEEK_END-文件末尾
返回值:成功返回当前位置相对于起始位置的偏移量;失败返回-1
与库函数的fseek唯一区别就是第一个参数不同
注意:使用偏移后尽量再偏移回到起始位置,否则下次忘记了,用的时候会发生一些低级错误

close

int close(int fd) 参数(文件描述符)
功能:通过文件描述符关闭文件,释放资源

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WhiteShirtI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值