C 使用fread()以块形式打印管道输出,但fread()未读取最后一个块

C 使用fread()以块形式打印管道输出,但fread()未读取最后一个块,c,windows,pipe,popen,fread,C,Windows,Pipe,Popen,Fread,我正在尝试使用\u popen在Windows上执行命令,并仅使用fread()读取管道的分块输出(我对另一种方法持开放态度,只要它以8192字节分块读取。我以分块读取的原因是,我计划使用此方法以8192字节分块通过TCP发送输出) 以下是我的尝试: #include <stdio.h> int main(void) { const int BUFLEN = 8192; char buf[BUFLEN + 1] = { 0 }; FILE* fpipe;

我正在尝试使用
\u popen
Windows
上执行命令,并仅使用fread()读取管道的分块输出(我对另一种方法持开放态度,只要它以8192字节分块读取。我以分块读取的原因是,我计划使用此方法以8192字节分块通过TCP发送输出)

以下是我的尝试:

#include <stdio.h>

int main(void) {
    const int BUFLEN = 8192;
    char buf[BUFLEN + 1] = { 0 };
    FILE* fpipe;

    // Call Popen to execute command and read the pipe's output.
    // the file is exactly 229401 bytes.
    fpipe = _popen("type 229401.txt", "r");

    // Store command output.
    while (fread(buf, 1, BUFLEN, fpipe)) {
        printf("%s", buf);
        //send(socket, buf, strlen(buf), 0);
    }
    printf("\n");

    // Close the pipe.
    _pclose(fpipe);

    return 0;
}
#包括
内部主(空){
常数int BUFLEN=8192;
char buf[BUFLEN+1]={0};
文件*fpipe;
//调用Popen执行命令并读取管道的输出。
//该文件正好是229401字节。
fpipe=_popen(“类型229401.txt”,“r”);
//存储命令输出。
而(fread(buf,1,BUFLEN,fpipe)){
printf(“%s”,buf);
//发送(套接字,buf,strlen(buf),0);
}
printf(“\n”);
//把管子关上。
_pclose(fpipe);
返回0;
}

为什么这段代码不读取整个文件?如何正确地读取/打印整个文件的块?

请记住,C中的
char
字符串实际上称为以null结尾的字节字符串。您确定
buf
中的数据以*null结尾吗?也许你应该确定它是吗?是的,我将缓冲区初始化为所有空字节
{0}
(BUFLEN+1)我只存储了
BUFLEN
字节,所以剩下最后一个空字节。我敢问你对
\u popen
调用的
文件*?这并不是为了压制警告,对吧?你似乎误解了
fread
的工作原理。如果最后一个块的大小不是
BUFLEN
,则
fread
将返回一个小于
BUFLEN
但仍然大于
0
的值(这是一个“真”值)。之后,它将开始返回
0
size\t ret\u read
while((ret_read=fread(buf,1,BUFLEN,fpipe))>0{
fwrite(buf,1,ret_read,stdout);