Linux【基础IO】

标准库IO接口:

  • fopen
  • fread/fwrite
  • fseek
  • fclose

FILE *fopen(const char *path, const char *mode);

path:文件路径名
mode:

  • r 只读
  • r+ 可读可写(覆盖式写入)
  • w 只写,若文件不存在则创建,若文件有内容则清空再写入
  • w+ 可读可写
  • a 追加写打开,若文件不存在则创建,每次定位在文件末尾
  • a+ 相较于a,多了可读操作

返回值:文件操作句柄—文件流指针

size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

ptr:要写入的数据
size:要写入块的大小(fwrite对数据进行按块操作)
nmemb:要写入的块个数
stream:fopen返回的文件流指针
返回值:实际写入的块个数

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

ptr:用于接收数据的缓冲区
size:要读取的块大小
nmemb:要读取的块个数
stream:fopen返回的文件流指针
返回值:实际读到的块个数 文件末尾:返回0

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

对stream文件的读写位置跳转到whence位置偏移offset个字节处
whence:跳转的起始位置

  • SEEK_SET 文件起始位置
  • SEEK_CUR 当前读写位置
  • SEEK_END 文件末尾位置

offse:偏移量

int fclose(FILE *stream);

那么我们来写个小程序来感受一下库函数IO接口

#include<stdio.h>
#include<errno.h>                                  
#include<string.h>

 int main() {                             
   FILE* fp=fopen("myfile","w");                                 
   if(fp==NULL) {
     printf("fopen error\n");        
   }            
   char* message="have a nice day!\n";
   fwrite(message,strlen(message),1,fp);
   fclose(fp);
   return 0;                     
 }

首先用"w"方式打开一个myfile文件,我们看到开始我们是没有这个文件的,“w"方式为我们创建了一个myfile文件,并且在myfile文件中写入了"have a nice day!”
在这里插入图片描述
在这里插入图片描述
将"w"换成"a",并运行4次test程序,myfile文件中就成了5句话,说明"a"以是追加方式写,换成"r+"的话,则每次都是新写入的数据,"r+"是覆盖式写入
在这里插入图片描述
在使用完文件之后别忘了用fclose()关闭文件哦!!!

系统调用IO接口:

  • open
  • write
  • read
  • lseek
  • close

int open(const char *pathname, int flags, mode_t mode)

功能:打开文件
pathname:指定打开的文件名称
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
必选参数:

  • O_RDONLY: 只读打开
  • O_WRONLY: 只写打开
  • O_RDWR : 读,写打开

这三个常量,必须指定一个且只能指定一个
可选参数:

  • O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
  • O_EXCL:与O_CREAT同时使用,若文件存在则报错,不存在则创建
  • O_TRUNC:打开文件同时截断文件长度为0
  • O_APPEND: 追加写

返回值:成功:新打开的文件描述符 错误;-1

ssize_t write(int fd, const void *buf, size_t count);

fd:open打开文件所返回的文件描述符
buf:要写入的数据
count:要写入的字节数
返回值:实际写入的字节数 失败:-1

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

whence:跳转的起始位置
SEEK_SET 文件起始位置
SEEK_CUR 当前读写位置
SEEK_END 文件末尾位置
offset:偏移量

ssize_t read(int fd, void *buf, size_t count);

从fd文件中读取count长度的数据放到buf中
返回值:返回实际读取到的字节数 失败:-1

int close(int fd);

用于关闭文件

    1 #include<stdio.h>                                                                                                                           
    2 #include<fcntl.h>
    3 #include<errno.h>
    4 #include<unistd.h>
    5 #include<sys/stat.h>
    6 #include<string.h>
    7 
    8 
    9 int main() {
   10   //将当前文件权限掩码值修改为000,默认为002
   11   umask(0);
   12   int fd=open("./test1.txt",O_RDWR|O_CREAT|O_APPEND|O_TRUNC,0664);
   13   if(fd<0){
   14     perror("open error");
   15     return -1;
   16   }
   17   char* message="today is a good day!\n";
   18   ssize_t ret=write(fd,message,strlen(message));
   19   if(ret<0) {
   20     perror("write error");
   21     return -1;
   22   }
   23   lseek(fd,0,SEEK_SET);
   24 
   25   char buf[1024]={0};
   26   ret=read(fd,buf,1023);
   27   if(ret<0) {
   28     perror("read error");
   29     return -1;
   30   }
   31   printf("ret:%d-%s\n",ret,buf);
   32   close(fd);
   33   return 0;
   34 }

运行结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值