文件操作(Liunx系统编程)

文件操作

  1. open
  2. read
  3. write
  4. lseek
  5. fopen
  6. fread
  7. fwrite
  8. fseek(与seek用法相同)

1. open()文件打开

函数原型: int open(const char *pathname, int flags);

打开或者创建文件需要下面3个头文件(查询头文件可在Liunx下使用 man 2 open查找,不需要强行记下)
并且 open的返回值为 int 型
int fd;//文件描述符
fd = open("./file1",O_RDWR);
文件名 ,打开方式可读可写(第二张图)
在这里插入图片描述
在这里插入图片描述
代码示例:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
   int fd;

   fd = open("./file1",O_RDWR);
   if (fd == -1)//打开文件若失败返回值为-1 在man手册中可以进行查询
    {
       printf("open file1 failed \n");
       fd = open("./file1",O_RDWR|O_CREAT,0600);//O_CREAT是创建文件的意思  0600为创建文件的允许位
       if(fd>0)
        {
            printf("creat file1 success\n");
            printf ("file1 =%d\n",fd);

        }
    }
   return 0;
}

2. wirte()文件写入

原型: ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符
buf:写入文件的内容
count:写入文件的大小
在这里插入图片描述
代码示例(见下一个read中的示例,write和read结合)

3.read()文件读取

函数原型 ssize_t read(int fd, void *buf, size_t count)
fd:文件描述符
buf:将fd里面的内容读到buf里面
count: 读取内容的大小
在这里插入图片描述
代码示例:

int main()
{
   int fd;
   char *buf="xxxxxxx";//内容自己定义

   fd = open("./file1",O_RDWR);
   if (fd == -1)
    {
       printf("open file1 failed \n");
       fd = open("./file1",O_RDWR|O_CREAT,0600);
       if(fd>0)
        {
            printf("creat file1 success\n");

        }
    }

   printf ("file1 =%d\n",fd);
  
  int n_write = write(fd,buf,strlen(buf));
  if(n_write != -1)
  {
    printf("write %d to file1 success\n ",n_write);
  }
  close(fd);//关闭文件
  fd = open("./file1",O_RDWR);//重新打开该文件,为了使光标回到初始的位置,正常直接使用lseek函数即可(seek的使用方法将在下面介绍);
  
  char *readBuf;
  readBuf=(char *)malloc(sizeof(char)*n_write+1);//初始化readBuf这个指针,为了防止内存不够所以需要在n_wirte的基础上加1;
  
  int n_read = read(fd,readBuf,n_write);
  printf("%d,contxet:%s\n",n_read,readBuf);
 
  close(fd);

   return 0;
}

结果示例:
在这里插入图片描述

4.lseek()文件光标的位置改变

函数原型 off_t lseek(int fd, off_t offset, int whence);
off_t offset:偏移值(一般情况为0)
seek-set :开始位置
seek-cur:当前位置
seek-end:结束位置

lseek(fd,0,SEEK_SET);//直接把光标移到开始的位置(代替这个↓),就不需要再关闭文件然后打开文件,这种略显憨憨的操作了
在这里插入图片描述
运用以上函数我们可以写一个自己的cp文件
代码示例:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
   int fdSrc;
   int fdDes;
   char *readBuf;

   if (argc != 3)
   {
      printf("pro errro\n");
      exit(-1);
   }


    fdSrc = open(argv[1],O_RDWR);
    int size = lseek(fdSrc,0,SEEK_END);
    readBuf = (char *)malloc(sizeof(char)*size +8);//开辟大小为一个char型的大小*一个文件的大小 在+8防止内存不够
    lseek(fdSrc,0,SEEK_SET);

    int n_read = read(fdSrc,readBuf,size);

    fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);

    int n_write = write(fdDes,readBuf,strlen(readBuf));

  close(fdSrc);
  close(fdDes);

   return 0;
}

结果示例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.fopen()基于c自带的文件打开方式

FILE *fopen(const char *path, const char *mode);函数原型
FILE *fp;//文件描述符
fp =fopen("./chenxinbo.txt",“w+”);
在这里插入图片描述

6.fread()基于c自带的文件读取方式

函数原型

 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
void *ptr:指向要读取的数组中首个对象的指针,将数据读到这里
size_t size, size_t nmemb:	每个对象的大小(单位是字节)
size_t nmemb:要读取的对象个数
 FILE *stream :输入流 为上面的fp

7.wirte()基于c自带的文件写入方式

函数原型:

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
const void *ptr:是一个指针,对fwrite来说,是要获取数据的地址
 size_t size:要写入内容的单字节数
 ize_t nmemb:要进行写入size字节的数据项的个数;
 FILE *stream :输入流 为上面的fp

代码示例(包括fopen(),fread(),fseek()):

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

int main()
{
        FILE *fp;
        char *str = "xxxxxxx";
        char readBuf[128]={0};

        fp =fopen("./xxx.txt","w+");

        fwrite(str,sizeof(char),strlen(str),fp);

        fseek(fp,0,SEEK_SET);

        fread(readBuf,sizeof(char),strlen(str),fp);
        printf("this text is :%s\n",readBuf);

        return 0;

}

总结open与fopen的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值