c - 在 linux 上的 C 中,你将如何实现 cp

标签 c linux copy

我在 google 代码上发现超过 50 行,这对于我正在尝试做的事情来说完全没有必要。

我想在 C 中做一个非常简单的 cp 实现。

这样我就可以调整缓冲区大小,看看它如何影响性能。

我只想使用 Linux API 调用,如 read()write(),但我没有运气。

我想要一个定义为特定大小的缓冲区,以便可以将 file1 中的数据读入缓冲区,然后写入 file2 并继续,直到 file1 达到 EOF。

这是我尝试过的,但它没有做任何事情

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

#define BUFSIZE 1024

int main(int argc, char* argv[]){

    FILE fp1, fp2;
    char buf[1024];
    int pos;


    fp1 = open(argv[1], "r");
    fp2 = open(argv[2], "w");

    while((pos=read(fp1, &buf, 1024)) != 0)
    {
        write(fp2, &buf, 1024);
    }


    return 0;
}

它的工作方式是 ./mycopy file1.txt file2.txt

最佳答案

这段代码有一个重要的问题,无论你读了多少,你总是写入 1024 字节。

还有:

  1. 您不检查命令行参数的数量。
  2. 您不检查源文件是否存在(如果打开)。
  3. 您没有检查目标文件是否打开(权限问题)。
  4. 您将数组的地址传递给数组,该数组的类型与指向数组第一个元素的指针的类型不同。
  5. fp1的类型错误,fp2的类型也是错误的。

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #include <fcntl.h>
    
    int main(int argc, char **argv)
    {
        char buffer[1024];
        int files[2];
        ssize_t count;
    
        /* Check for insufficient parameters */
        if (argc < 3)
            return -1;
        files[0] = open(argv[1], O_RDONLY);
        if (files[0] == -1) /* Check if file opened */
            return -1;
        files[1] = open(argv[2], O_WRONLY | O_CREAT | S_IRUSR | S_IWUSR);
        if (files[1] == -1) /* Check if file opened (permissions problems ...) */
        {
            close(files[0]);
            return -1;
        }
    
        while ((count = read(files[0], buffer, sizeof(buffer))) != 0)
            write(files[1], buffer, count);
    
        return 0;
    }
    

关于c - 在 linux 上的 C 中,你将如何实现 cp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33792754/

相关文章:

Java 已安装,在 list 中,但执行产生 "./java: No such file or directory"

linux - gdb服务器错误

javascript - 如何将 <div> 复制到 &lt;textarea&gt; 副本中,以便在点击 "enter keyboard button"时也复制换行符?

javascript - 无法将 document.execCommand ('copy' )与输入类型文件一起使用

c - 在 linux 内核驱动程序中向平台设备添加属性

c - printf 语句直到中断才打印

linux - 复制具有软链接(soft link)的目标文件

docker - 将ARG中的多个文件指定为Dockerfile中的COPY

c - 将缓冲区 (char*) 传递给 C 中的函数

c - 更快的子字符串处理 C++