来自c的读取功能过早地返回0

时间:2014-05-01 21:49:41

标签: c copy

我有这个代码将1 KB的块从源文件复制到目标文件(实际上创建了该文件的副本):

TEST.CPP

#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文件(我想要一个答案来改进我的代码,而不是一个完全不同的代码)。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

问题是您在循环中编写strlen(buff)个字节而不是n个字节。

每当缓冲区包含\0字节时,strlen将其视为“字符串结束”,并且最终不再写入。 (当它不包含\0时,你最终会读取缓冲区的末尾。)