//EDIT:我将第一个句柄的标志设置为 O_WRONLY,它应该是O_RDONLY的,这导致了问题。
我正在使用 C 在 Linux 中开发一个简单的程序,该程序可以将文本从一个文件复制到另一个文件。
#include<fcntl.h>
#include<unistd.h>
#include<stdio.h>
...
int main(int argc, char * argv[])
{
int cp_from = open(argv[1],O_WRONLY);
int cp_to = open(argv[2],O_WRONLY|O_CREAT,0777); //make a descriptor for each file
int size = lseek(cp_from,0,SEEK_END); //check the size of the first file
lseek(cp_from,0,SEEK_SET) //return to the start of the file, don't know if that's needed
char *buf = (char*) malloc (size*sizeof(char)); //allocate enough memory to fit all text from 1st file into char array
read(cp_from,buf,sizeof(buf)-1); //read from the 1st file to the char array
printf("%s",buf); //print the buf
close(cp_from);
close(cp_to);
...
所以,稍后我会将()"buf"写成"cp_to",这将(希望)起作用。但是,这里只有一半的工作,因为它在这一点上停止工作,"buf"是空的,我不知道为什么。有什么想法吗?
以下是一些评论点:
- 不要在 C 中强制转换
malloc()
的返回值。 - 不要在堆指针上使用
sizeof
,认为它会返回与分配的缓冲区大小有关的任何内容;它不会。您将获得指针的大小。 - 使用正确的类型,而不仅仅是对所有内容
int
。类型很重要,并非所有类型都像int
. - 不要将从文件中读取的随机数据视为字符串。
- 不要执行 I/O,也不检查返回值。I/O 可能会失败。
- 。内存分配也是如此。
最好使用小型(或小型)固定大小的缓冲区,并在循环中读/写。这样,无论文件的大小如何,程序都会使用有限的内存量。
以下代码:
- 仍然有关于未使用的变量
argc
的警告(见评论) - 缺少用于检查系统函数调用返回的错误指示的代码
- 实际有效
现在的代码
//#include <sys/types.h>
//#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
int cp_from = open(argv[1], O_RDONLY);
int cp_to = open(argv[2], O_WRONLY|O_CREAT,0777);
//make a descriptor for each file
size_t size = (size_t)lseek(cp_from,0,SEEK_END); //check the size of the first file
lseek(cp_from,0,SEEK_SET);
//return to the start of the file, don't know if that's needed
char *buf = malloc (size); //allocate enough memory to fit all text from 1st file into char array
read( cp_from, buf, size ); //read from the 1st file to the char array
write( cp_to, buf, size ); //print the buf
close(cp_from);
close(cp_to);
}