自己从手写cp,记录

#include <stdio.h>
#include <fcntl.h>
 
#define BUF_SIZ 100
/*
logic:写一个cp,要求文件中的空格不能少
*/

/*
//fgets char *fgets(char *buf, int bufsize, FILE *stream);
首先他不能直接操作 fd, 只能放数组里,第三个参数类型是 FILE*

fprint 是格式化输出

//这不就是fd版的 fgets
ssize_t read [1]  (int fd, void *buf, size_t count);

出错:
时间往往浪费在简单的事情上,养成一个好习惯,往往比学习复杂的东西更有用!!!另外还是要多尝试
O_TRUNC这个东西会清空原来的文件内容(地基不稳)
open write这种函数返回的判断条件设为 小于0 

*/

int main(int ac, char * av[])
{
 
  int fd,fd1 = -1;
  if(ac != 3)
  {
    printf("cp need two param\n");
    return 1;
  }

  
  if((fd = open(av[1], O_RDONLY)) <0){  //这个权限开始只写,返回值不是-1,所以一直没有发现,刚开始好顺手写了第三个参数,只有在该文件本身权限允许,才不会报错
  //耽误了我好长时间
    printf("open source file fail \n");return 1;
  }
    
  
  fd1  = open(av[2], O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP |S_IROTH | S_IWOTH);
  if (fd1 <0)
  {
    printf("open object fail \n");
    return 1;
  }
  
  ssize_t num;
  char buf[BUF_SIZ];
  int i =0;
  unsigned long holeSize = 0;
  while((num = read(fd, buf, BUF_SIZ)) > 0) 
  {
   printf("num %d\n", num);  //应该早点打印num,发现上面括号写的有问题
   for (i = 0; i < num; i++) {
			if (buf[i] == '\0') {
				holeSize++;
			} else if (holeSize > 0) {
				lseek(fd1, holeSize, SEEK_CUR);
				write(fd1, &buf[i], 1);
				holeSize = 0;
			} else {
				write(fd1, &buf[i], 1);
			}
		}
   
  }
  close(fd);
  close(fd1);
}

除了程序里标注的低级错误,让我深刻认识到动手的重要性,光这个cp花了我两个小时。fuck

高级错误就是实现该功能的逻辑,根本想不到,好吗

cp,功能从A文件中读,保存到buf中,然后在写到B文件中。

拿到这个问题,首先想了一下,用open比fopen好,具体再补充!!(嘻嘻),然后想有没有两个fd直接传内容过去的功能,

没有。随后决定用buff做个缓存,这样的话,buf的大小是个问题,这里涉及一个思维,只能写个循环,一直到'\0',才取数据结束;那么buf的大小就成了取数据的单位,就不重要了,这里是100。因为要一个一个字符判断是不是 '\0',所以要一个个检验,所以一次write一个字符。还有一个比较重要的是,要确保不能覆盖,所以要用lseek,实现append的功能。

猜你喜欢

转载自blog.csdn.net/qq_24328911/article/details/84102846