gpt4 book ai didi

c - 从 c 读取函数过早返回 0

转载 作者:太空宇宙 更新时间:2023-11-04 02:03:37 25 4
gpt4 key购买 nike

我有这段代码可以将 1 KB 的 block 从源文件复制到目标文件(实际上是创建文件的副本):

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

感谢您的帮助!

最佳答案

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

每当缓冲区包含一个\0 字节时,strlen 会将其视为“字符串结尾”,您最终不会再写入任何内容。 (当它不包含 \0 时,您最终会读到缓冲区末尾)。

关于c - 从 c 读取函数过早返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23417257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com