fread丢失二进制数据

时间:2018-03-11 09:40:21

标签: c++ c

我正在使用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 ...

2 个答案:

答案 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()