gpt4 book ai didi

c++ - fread 丢失二进制数据

转载 作者:行者123 更新时间:2023-11-30 18:34:55 29 4
gpt4 key购买 nike

我正在使用 fread 函数来读取通过 TCP 发送的文件。我发现,如果文件是二进制文件,则 fread 不会读取整个文件。我尝试了在互联网上找到的所有内容,但没有任何帮助。我的代码是:

#define BUFSIZE 1024
char buf[BUFSIZE];
FILE *file = fopen(soubor,"rb"); //I do a check which i won't write here
size_t bytes_loaded = 0;
while (!feof(file))
{
bytes_loaded = fread(buf,1,BUFSIZE,file);
if(bytes_loaded != BUFSIZE)
{
if(!feof(file))
{
for(int i = 0; i < 100;i++)
{
fseek(file,-strlen(buf),SEEK_CUR);
bytes_loaded = fread(buf,1,BUFSIZE,file);
if(bytes_loaded == BUFSIZE)
{
break;
}
else if(i == 99)
{
fprintf(stderr,"C could't read the file\n");
fclose(file);
close(client_socket);
return 1;
}
}
}
}

bytestx = send(client_socket, buf, BUFSIZE, 0);
if (bytestx < 0)
perror("ERROR in sendto");
bzero(buf, BUFSIZE);
bytes_loaded = 0;
}

我做错了什么吗?例如 fread 检查...

最佳答案

你的整个 fread() 错误处理是错误的,摆脱它(在二进制缓冲区上使用 strlen() 无论如何都是错误的)。

事实上,您不应该使用 feof() 来控制循环。只需在循环中调用 fread() ,直到它在 EOF 或错误时返回 < 1 (使用 feof()ferror() 来区分) 。当它返回 > 0 时,您需要将该值传递给 send,而不是传递 BUFSIZE

尝试更多类似这样的事情:

#define BUFSIZE 1024

char buf[BUFSIZE], *pbuf;
FILE *file = fopen(soubor, "rb");
...
size_t bytes_loaded;
do
{
bytes_loaded = fread(buf, 1, BUFSIZE, file);
if (bytes_loaded < 1)
{
if ((!feof(file)) && ferror(file))
fprintf(stderr, "Couldn't read the file\n");
break;
}

pbuf = buf;
do
{
bytestx = send(client_socket, pbuf, bytes_loaded, 0);
if (bytestx < 0)
{
perror("ERROR in send");
break;
}
pbuf += bytestx;
bytes_loaded -= bytestx;
}
while (bytes_loaded > 0);
}
while (bytes_loaded == 0);
fclose(file);
...

关于c++ - fread 丢失二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49218615/

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