我有这个代码将1 KB的块从源文件复制到目标文件(实际上创建了该文件的副本):
#include<stdio.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<string.h>
int main() {
int fd = open("file1.mp4", O_RDONLY);
int fd2 = open("file2.mp4", O_WRONLY | O_CREAT | O_APPEND);
int nr = 0;int n;
char buff[1024];
memset(buff, 0, 1024);
while((n = read(fd, buff, 1024)) != 0) {
write(fd2, buff, strlen(buff));
nr = strlen(buff);
memset(buff, 0, 1024);
}
printf("succes %d %d\n", nr,n);
close(fd);
close(fd2);
return 0;
}
我曾尝试复制.mp4文件,该文件有250 MB,但结果只有77.4 MB。最后一个read()的返回值n为0,因此不应该有任何错误(但它应该是,因为它不会复制整个输入文件)。
我认为.mp4文件有一个EOF字节,实际上并不意味着文件的结尾。 我该怎么做才能复制整个.mp4文件(我想要一个答案来改进我的代码,而不是一个完全不同的代码)。
感谢您的帮助!
答案 0 :(得分:3)
问题是您在循环中编写strlen(buff)
个字节而不是n
个字节。
每当缓冲区包含\0
字节时,strlen
将其视为“字符串结束”,并且最终不再写入。 (当它不包含\0
时,你最终会读取缓冲区的末尾。)