#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的功能。