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);
。