我想重写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);
}
Run Code Online (Sandbox Code Playgroud)
dla*_*tte 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);
Run Code Online (Sandbox Code Playgroud)
更新:添加正确的打开...
顺便说一句,O_CREAT可以是OR'd(O_CREAT | O_WRONLY).实际上你打开了太多的文件句柄.只做一次开放.
Chi*_*chi 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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:glibc参考有这样说:
通常,您应该坚持使用流而不是文件描述符,除非您想要执行的某些特定操作只能在文件描述符上完成.如果您是初学程序员并且不确定要使用哪些函数,我们建议您专注于格式化输入函数(请参阅格式化输入)和格式化输出函数(请参阅格式化输出).
如果您担心程序可以移植到GNU以外的系统,您还应该知道文件描述符不像流一样可移植.您可以期望任何运行ISO C的系统都支持流,但非GNU系统可能根本不支持文件描述符,或者可能只实现对文件描述符进行操作的GNU函数的子集.但是,GNU库中的大多数文件描述符函数都包含在POSIX.1标准中.