来自 ReadFile() 的乱码?
Gibberish from ReadFile()?
我已经使用管道重定向了 java.exe 的标准输出。现在我使用 ReadFile 和 char buffer 读取输出:
ReadFile( childStdOUTRd, buffer, sizeof(char) * 4096, &read, NULL);
缓冲区将被分配正确的数据。但是如果我把它改成 TCAHR[4096]:
ReadFile( childStdOUTRd, buffer, sizeof(TCHAR) * 4096, &read, NULL);
缓冲区收到乱码。我错过了什么吗?
首先你应该检查 ReadFile
的 return 值。如果它 returned FALSE
那么读取失败并且数据可能是乱码。
另外,检查 read
的值。它会说明读取了多少个字符。不要尝试使用缓冲区中超过 read
字节值的任何内容。
接下来,ReadFile
函数接收原始字节,它不解释它们。如果您的系统将 TCHAR
定义为 16 位 wchar_t
,则此调用将从输入流中读取 8192
字节。它应该可以正常工作。
你没有说你是如何确定缓冲区收到的 "gibberish"。如果您试图假装缓冲区包含实际的 wchar_t
s 但输入流不包含 wchar_t
s 那么它就没有意义。解决办法是:不要那样做。
最后,TCHAR
在过去的 15 年里已经不相关了。根据您的需要使用 char
或 wchar_t
。
我已经使用管道重定向了 java.exe 的标准输出。现在我使用 ReadFile 和 char buffer 读取输出:
ReadFile( childStdOUTRd, buffer, sizeof(char) * 4096, &read, NULL);
缓冲区将被分配正确的数据。但是如果我把它改成 TCAHR[4096]:
ReadFile( childStdOUTRd, buffer, sizeof(TCHAR) * 4096, &read, NULL);
缓冲区收到乱码。我错过了什么吗?
首先你应该检查 ReadFile
的 return 值。如果它 returned FALSE
那么读取失败并且数据可能是乱码。
另外,检查 read
的值。它会说明读取了多少个字符。不要尝试使用缓冲区中超过 read
字节值的任何内容。
接下来,ReadFile
函数接收原始字节,它不解释它们。如果您的系统将 TCHAR
定义为 16 位 wchar_t
,则此调用将从输入流中读取 8192
字节。它应该可以正常工作。
你没有说你是如何确定缓冲区收到的 "gibberish"。如果您试图假装缓冲区包含实际的 wchar_t
s 但输入流不包含 wchar_t
s 那么它就没有意义。解决办法是:不要那样做。
最后,TCHAR
在过去的 15 年里已经不相关了。根据您的需要使用 char
或 wchar_t
。