我正在使用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 check ...
答案 0 :(得分:2)
您的整个fread()
错误处理错误,摆脱它(在二进制缓冲区上使用strlen()
无论如何都是错误的。)
事实上,您不应该使用feof()
来控制循环。只需在循环中调用fread()
,直到它返回&lt; 1关于EOF或错误(使用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);
...
答案 1 :(得分:1)
如果你只是将字节从文件转移到套接字,那么你可以继续循环来自std::fread
的返回值,它告诉你读取了多少字节,然后将那么多字节发送到{{1} 1}}命令。
像这样(未经测试的)代码:
send()