我正在写一段代码,从一个文件读取并写入另一个文件,我有一个问题,决定缓冲区的大小,因为我不知道,它可能是任何文件,也如何从一个文件读取使用while循环?
这里我打开了第一个文件。
int fd1 = open(args[1], O_RDONLY);
if(fd1 == -1){
perror("error");
return;
}
这里我打开了第二个文件。
int fd2 = open(args[2], O_WRONLY|O_TRUNC);
if (fd2 == -1) { // if we couldn't open the file then create a new one (not sure if we supposed to this ?)
fd2 = open(args[2], O_WRONLY|O_CREAT, 0666);
if (fd2 == -1) {
perror("error");
return;
}
}
这里是我如何尝试读取。
char* buff;
int count = read(fd1, buff, 1); /// read from the file fd1 into fd2
while (count != -1) {
if (!count) {
break;
}
if (write(fd2, buff, 1) == -1) {
perror("smash error: write failed");
return;
}
read_res = read(fd1, buff, 1);
if (read_res == -1) {
perror("smash error: read failed");
return;
}
}
cout <<"file1 was coppiesd to file 2" << endl ;
你应该读一读指针。读取函数需要一个指针来使用,传统的解决方案是这样的
#SIZE 255
char buff[SIZE]
int count = read(fd1, buff, SIZE)
//add logic to deal reading less then SIZE
这是因为数组的名称是指向数组中第一个元素的指针。
如果你每次只想读一个字节,我建议你像我下面做的那样,把buff改成一个char(不是ptr改成char),然后简单地用&传递buff的地址。
char buff;
int count = read(fd1, &buff, 1); /// priming read
while (count != -1) {
if (!count) {
break;
}
if (write(fd2, &buff, 1) == -1) {
perror("smash error: write failed");
return;
}
read_res = read(fd1, &buff, 1);
if (read_res == -1) {
perror("smash error: read failed");
return;
}
}
cout <<"file1 was coppiesd to file 2" << endl ;
如果不行,请告诉我