Linux文件编程 (文件的打开,读写及光标的移动) 用基本函数实现cp指令

一文件的打开及创建

1.1open函数

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

函数解读:
1.pathname是一个文件描述符,里面的参数是你想要打开或者创建的文件
形式一般为./文件名
flag是文件属性 O_RDONLY, O_WRONLY, O_RDWR.其中代表文件只读,只写,可读可写。这三个属性只能选择其中一种。但可以附加如下属性O_CLOEXEC, O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTY, O_NOFOLLOW, O_TMPFILE, O_TRUNC.
不过常用属性为
O_CREAT 如果你写入的pathname并不存在,系统会帮你创建
注意:O_CREAT一旦被使用就需要写入mode_t mode参数,一般为文件权限
参数为00400为仅可读
参数为00200为仅可写
参数为00100为可执行
可读可写可执行为00700

O_EXCL如果同时指定了O_CREAT,如果文件已存在则出错
O_APPEND每次写入文件的东西加载到文件末尾
O_TRUNC当打开一个文件写入时,就会清理掉文件内之前残留的东西,重新开始写入
open成功执行后会返回一个较小的非负整数,来作为文件的索引
后续的相关操作close,write,read都需要这个返回值来操作对应文件

二 文件的写入与读取

2.1 文件写入

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

ssize_t write(int fd, const void *buf, size_t count);
返回值为整形,函数的返回值为写入的字节数
fd为open产生的数值
buf为文字缓冲区,里面存放你想要写入的数据,count为写入文字的字数

2.2文件读取

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

ssize_t read为整形,是读取的类型数
buf为缓冲区,将读取的文字存放的地方
count为读取的字节个数

2.3文件写入操作

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char *buf;//写入缓冲区
  buf = "csdn";//确定写入的字符
  int fd;//文件描述符
  fd = open("./file1", O_RDWR|O_CREAT,00600);//以可读可写方式打开
  if(fd<0){
      printf("false\n");
      perror("why\n");
  }else{
      printf("success\n");
  }
  int n_write = write(fd,buf,strlen(buf));写入
  close(fd);
}

在这里插入图片描述
效果如图

2.4 文件读取操作

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char *buf;//读入缓冲区
  buf = (char*)malloc(sizeof(char)*8);//开辟一个空间
  int fd;
  fd = open("./file1", O_RDWR|O_CREAT,00600);//打开文件描述符
  if(fd<0){
      printf("false\n");
      perror("why\n");
  }else{
      printf("success\n");
  }
  int n_read = read(fd,buf,8);//读入缓冲区
  close(fd);
  printf("%s %d",buf,n_read);
}

在这里插入图片描述
效果如图

2.5 光标移动操作

当我们写入时光标会随之移动,写入完成后光标会在文件的末尾跳动。在当我们接着读取文件操作时,已经无法读取到了(读取会读光标后的文件)。所以在读取文件时,对光标的控制是非常重要的

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

off_t lseek(int fd, off_t offset, int whence);
fd为文件描述符
offset:偏移字节数
whence:文件所在位置(SEEK_SET起始位置,SEEK_CUR当前位置,SEEK_END末尾位置)

2.6光标移动示例

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char *buf;//写入文件缓冲区
  buf = "hajie";//写入的文件
  int fd;
  fd = open("./file1", O_RDWR|O_CREAT|O_TRUNC,00600);
  if(fd<0){
      printf("false\n");
      perror("why\n");
  }else{
      printf("success\n");
  }
  int n_write = write(fd,buf,strlen(buf));//写入文件
  lseek(fd,0,SEEK_SET);//光标移动到开头
  char *readbuf = malloc(sizeof(char)*n_write);//创建读取缓冲区
  int n_read = read(fd, readbuf, n_write);//读取
  printf("n_write = %d,n_read = %d,content:%s\n",n_write,n_read,readbuf);//打印内容
  close(fd);
}

三 创建cp指令

3.1 int main(int argc,char** argv)的理解

示例程序

#include<stdio.h>
int main(int argc,char **argv)
{
   printf("%d\n",argc);
   printf("%s\n",argv[0]);
   printf("%s\n",argv[1]);
   printf("%s\n",argv[2]);
   printf("%s\n",argv[3]);
}

运行结果

4
./a.out
aa
bb
cc

我们在命令框输入./a.out aa bb cc时可以看出main函数获取了四个指令,所以argc值为4
char *和char[] 意思一样,它是数组的数组,即每个数组元素都是字符数组(字符串)来保存我们输入的指令

3.2 cp指令实现

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
       int fdsf;//想要复制的文件
       int fddf;//复制到的目标文件
       char *sharebuf=NULL;
       if(argc!=3){
           printf("error!");
           exit(-1);
       }

       fdsf =  open(argv[1],O_RDWR);//打开原文件
       int size= lseek(fdsf,0,SEEK_END);//计算文件长度(将光标置于尾巴,返回值为现光标位置到文件开头的偏移值)
       if(size<0){
           perror("why\n");
       }
       sharebuf = (char*)malloc(sizeof(char)*size+8);
       lseek(fdsf,0,SEEK_SET);//重新设置光标,防止读不到内容
       int n_read =  read(fdsf,sharebuf,size+8);
       fddf =  open(argv[2],O_RDWR|O_CREAT,00600);//打开目标文件
       int n_write = write(fddf,sharebuf, size);//写入
       printf("size = %d,n_read = %d,n_write = %d",size,n_read,n_write);
       close(fdsf);
       close(fddf);//关闭两个文件
}
~                                                
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pg_hj

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

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

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

打赏作者

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

抵扣说明:

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

余额充值