open() close() read() write() lseek()

本文详细介绍了C语言中的文件操作函数,如open()用于打开或创建文件,read()和write()进行读写操作,lseek()用于定位文件指针。还讨论了文件权限、非阻塞模式和函数重载/变参的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.open()

int open(const char *patnname,int flags);

打开或创建一个文件或者device。

flags文件打开常用的选项是 O_RDONLY(只读),O_WRONLY(只写),O_RDWR(读写),这三个是必须有一个的加上一些文件创建的选项和文件状态选项。在加上O_CREAT,这个函数就变成了

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

创建文件的权限由第三个参数mode决定最终的权限,例如777即拥有者以及用户组还有其他用户都是可读可写可执行。

返回值:成功返回的是新的文件描述符(>0);失败返回-1

这个函数是不是阻塞函数在于你有没有加O_NONBLOCK,加上去这句话就是非阻塞,没有加上去那就是阻塞函数。

fopen函数的mode与open函数的flag

r     O_RDONLY

r+    O_RDWR

w    O_WRONLY|O_CREAT|O_TRUNC

w+  O_RDWR|O_TRUNC|O_CREAT

flags就是位图操作,位图就是通过或和与。如果想要测试O_WRONLY是否有这个功能。可以先或后与查看这两次的区别。

创建文件得到的权限是用你给的值mode&~umask得到文件权限

这个函数有三参和两参的区别,在java里面叫做重构,但是c语言里面没有重构这个概念,所以c语言里面这个函数是通过变参函数来实现的。

如何判断函数使用重载还是变参来实现的,那就在这个函数当中多输入几个参数,如果报语法错误那就是重载,如果不报错或者报其他错误那就是变参实现的。

gcc -Wall 文件名  打印所有的警告

gcc 本身的说法就比较圆环,虽然他报出来的是waring但其实是一个err。在做内核移植的时候除了一些可以解释的waring,其他waring都应该调试成没有警告。

int close (fp);关闭一个文件描述符。

2.read wite

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

fd可以是文件也可以是设备因为一切皆文件。

从fd中读count到buf。

成功返回读到的字节个数,如果读到文件尾那么返回0.

失败返回-1。并记录当前错误的原因到errno。也就是用perroe("read()");会输出错误的原因。

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

向fd中写(已经成功打开的),来源是buf,写count个到文件或设备中去。

成功返回写入的字节数,0是一个也没写进去。

因为err有真错和假错,假错是因为你被某些阻塞或者非阻塞一些会遇到的情况打断了,才会导致写入0个,所以0不一定是出错,要看err的原因判断是不是真出错。

失败 -1 设置errno。

程序#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BUFSIZE  20
int main(int argc,char **argv)
{
        if(argc<3)
        {
                fprintf(stderr,"usage :%s <srcfile> <destfile>",argv[0]);
                exit(1);
}
        int sfd,sfp;
        char buf[BUFSIZE];
        int len,ret,pos;
        sfd=open(argv[1],O_RDONLY);
        if(sfd<0)
        {
                perror("open()");
                exit(1);
        }
        sfp=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777);
        if(sfp<0)
        {
                close(sfd);
                perror("open()");
                exit(1);
        }
        while(1)
        {
            len=read(sfd,buf,BUFSIZE);
              if(len<0)
            {
                    perror("read()");
                    break;
            } 
            if(len==0)
            {
                    break;
            }
            pos=0;
            while(len>0)
            {
                    ret=write(sfp,buf+pos,len);
                    if(ret<0)
                    {
                        perror("write()");
                        exit(1);
                }
                    pos+=ret;
                    len=len-ret;
            }
        }
        close(sfd);
        close(sfp);
        exit(0);
}

3.lseek()

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

whence : SEEK_SET,SEEK_CUR,SEEK_END

将鼠标位置插入到某个位置。

返回值:成功从当前位置指针到你设置的文件位置指针所经历的字节数。

相当于fseeko与ftello的结合体。

程序

  1 #include "stdio.h"
  2 #include "stdlib.h"
  3 #include "sys/types.h"
  4 #include "sys/stat.h"
  5 #include "fcntl.h"
  6 #include "unistd.h"
  7 int main(int argc,char ** argv)
  8 {
  9         if(argc<2)
 10         {
 11                 fprintf(stderr,"Usage : %s <soufile> <destfile>",argv[0]);
 12                 exit(1);
 13           }
 14         int fp;
 15         off_t len;
 16         fp= open(argv[1],O_RDONLY);
 17         if(fp<0)
 18         {
 19                 perror("open()");
 20                 exit(1);
 21         }
 22         len=lseek(fp,0,SEEK_SET);
 23         if(len<0)
 24         {
 25                 perror("lseek()");
 26                 close(fp);
 27                 exit(1);
 28         }
 29         len=lseek(fp,0,SEEK_END);
 30         if(len<0)
 31         {
 32                     perror("lseek()");
 33                     close(fp);
 34                     exit(1);
 35         }
 36         printf("%s的长度为%ld字节",argv[1],len);
 37         close(fp);
 38         exit(0);
 39 }
~     

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小白羊羊

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

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

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

打赏作者

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

抵扣说明:

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

余额充值