我有这段代码:
for (;;) {
BOOL ReadSuccess = ReadFile(rdPipe, StdOutBuffer, 8192, &dwRead, NULL);
if (strlen(StdOutBuffer) <= 0) {
Sleep(100);
send(sock, RECIEVE_BREAK, strlen(RECIEVE_BREAK), 0);
break;
}
else if (!ReadSuccess || dwRead == 0) {
Sleep(100);
send(sock, RECIEVE_BREAK, strlen(RECIEVE_BREAK), 0);
break;
}
else {
send(sock, StdOutBuffer, strlen(StdOutBuffer), 0);
}
cout << StdOutBuffer << endl;
cout << "\n\n\n\n";
}
我的StdOutBuffer输出加倍有问题,例如,当我调用“tasklist”时,我有两次部分输出。
不是有人知道哪里可能有问题?
答案 0 :(得分:1)
函数ReadFile()
不会读取空终止的c-string,而是一个(此处为8192)个字符块,而不保证具有空终止符。
因此,无法保证调用strlen(StdOutBuffer)
可以提供任何有用的结果。您应该更依赖dwRead
。如果您读取的文本数据可能不是以null结尾(在文件中,或者看起来像是通过管道),您应该自己添加它:
StdOutBuffer[dwLen] = '\0';
即使读取失败,这仍然有效,因为ReadFile()
的第一件事就是将长度设置为0.请注意,缓冲区的大小应至少为8192 + 1个字符。
为什么会出现错误? 假设您收到一整行数据,幸运的是,它包含一些空终结符。然后,您将对其进行处理。现在假设在下一次迭代中你只收到几个字符(例如只是换行符):缓冲区的剩余部分不会被覆盖,并且因为你没有在结束时使用空终止符。新的字节读取,strlen()
会导致认为有更多的数据需要处理;一些数据将被第二次处理。