我想重写Linux的“cp”命令。所以这个程序将像#./a.out originalfile copiedfile
一样工作。我可以打开文件,创建新文件但不能写新文件。什么都没写。可能是什么原因?
当前的C代码是:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *aa[]){
int fd,fd1;
char buffer[100];
if(argc!=3){
printf("Usage : ./a.out <original> <copy> \n");
return -1;
}
fd=open(aa[1],O_RDONLY,S_IRUSR);
if(fd==-1){
printf("file not found.\n");
return -1;
}
fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);
if(fd1!=-1){
printf("file is created.\n");
}
ssize_t n;
while(n=read(fd,buffer,50)){
write(fd1,buffer,n);
printf("..writing..\n");
}
close(fd);
close(fd1);
}
答案 0 :(得分:14)
您需要将read()数据写入()数据到新文件中:
ssize_t nrd;
int fd;
int fd1;
fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
write(fd1,buffer,nrd);
}
close(fd);
close(fd1);
更新:添加了正确的打开...
顺便说一句,O_CREAT可以是OR(O_CREAT | O_WRONLY)。实际上你打开了太多的文件句柄。只需打开一次。
答案 1 :(得分:10)
首先,您编写的代码不可移植,即使您可以使用它。为什么在完全独立于平台的方式下使用特定于操作系统的功能呢?这是一个只使用单个头文件的版本,可以移植到任何实现C标准库的平台。
#include <stdio.h>
int main(int argc, char **argv)
{
FILE* sourceFile;
FILE* destFile;
char buf[50];
int numBytes;
if(argc!=3)
{
printf("Usage: fcopy source destination\n");
return 1;
}
sourceFile = fopen(argv[1], "rb");
destFile = fopen(argv[2], "wb");
if(sourceFile==NULL)
{
printf("Could not open source file\n");
return 2;
}
if(destFile==NULL)
{
printf("Could not open destination file\n");
return 3;
}
while(numBytes=fread(buf, 1, 50, sourceFile))
{
fwrite(buf, 1, numBytes, destFile);
}
fclose(sourceFile);
fclose(destFile);
return 0;
}
编辑:glibc reference有这样说:
一般来说,你应该坚持下去 使用流而不是文件 描述符,除非有一些 你想要做的具体操作 只能在文件描述符上完成。 如果你是一个初学程序员 我们不确定要使用哪些功能 建议你专注于 格式化输入功能(见 格式化输入)和格式化输出 函数(参见格式化输出)。
如果您担心可移植性 您的程序到除以外的系统 GNU,你也应该意识到这一点 文件描述符不是可移植的 作为流。你可以期待任何系统 运行ISO C来支持流,但是 非GNU系统可能不支持文件 描述符,或者只是 实现GNU的一个子集 在文件上运行的函数 描述。大部分文件 GNU中的描述符函数 库包含在POSIX.1中 但是,标准。
答案 2 :(得分:3)
您必须在与write
相同的循环中执行read
。
答案 3 :(得分:0)
您必须使用Mallock分配缓冲区,并为读写分配指向该缓冲区的指针。
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
ssize_t nrd;
int fd;
int fd1;
char* buffer = malloc(100*sizeof(char));
fd = open("bli.txt", O_RDONLY);
fd1 = open("bla.txt", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,sizeof(buffer))) {
write(fd1,buffer,nrd);
}
close(fd);
close(fd1);
free(buffer);
return 0;
}
确保rad文件存在并且包含某些内容。 这不是完美的,但可以。