我在 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
字节。
还有:
- 您不检查命令行参数的数量。
- 您不检查源文件是否存在(如果打开)。
- 您没有检查目标文件是否打开(权限问题)。
- 您将数组的地址传递给数组,该数组的类型与指向数组第一个元素的指针的类型不同。
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/