如何在Linux中用C编写文件?

我想重写Linux的“cp”命令。 所以这个程序将像#./a.out originalfile copiedfile一样工作。 我可以打开文件,创build新文件,但不能写入新文件。 没有什么是写的。 可能是什么原因?

目前的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); } 

Solutions Collecting From Web of "如何在Linux中用C编写文件?"

您需要将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'd(O_CREAT | O_WRONLY)。 你实际上是打开太多的文件句柄。 只要做一次开放。

首先,你写的代码是不可移植的,即使你得到它的工作。 为什么使用操作系统特定的功能时,有一个完全平台无关的方式呢? 这是一个只使用一个头文件的版本,可以移植到任何实现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参考有这样的说:

一般来说,应该坚持使用流而不是文件描述符,除非有一些特定的操作要做,只能在文件描述符上完成。 如果您是开始编程人员并且不确定要使用哪些函数,则建议您专注于格式化的输入函数(请参阅格式化输入)和格式化的输出函数(请参阅格式化输出)。

如果您担心程序可移植到GNU以外的系统,则还应该注意,文件描述符不像流一样便携。 您可以期望任何运行ISO C的系统支持流,但非GNU系统可能根本不支持文件描述符,或者只能实现对文件描述符进行操作的GNU函数的一部分。 但是,GNU库中的大部分文件描述符函数都包含在POSIX.1标准中。

您必须在read的同一个循环中进行write