【发布时间】:2013-02-27 05:12:57
【问题描述】:
我正在使用 CreateProcess 通过 Cygwin 的 bash.exe 运行 bash 脚本并重定向输出(因为这是客户想要的)。唯一剩下要解决的问题是,如果 ReadFile 没有填满 lpBuffer,我最终会在它的末尾有一堆垃圾字符,我想过滤掉它们。通常是这样的:
"ÌÌÌÌ...ÌÌÌÌÌuÆì¨õD"
下面的代码将为我提供:
"uÆì¨õD"
所以,我至少部分成功了=D
但是,我真正想要的是在第一个垃圾字符处终止字符串,最好也使用换行符,但我似乎找不到 fmt 的变体。
void ReadAndHandleOutput(HANDLE hPipeRead) {
char lpBuffer[256];
DWORD nBytesRead;
wstringstream wss;
while(TRUE)
{
if(!ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer), &nBytesRead, NULL) || !nBytesRead)
{
break;
}
// Filter out the weird non-ascii characters.
std::string buffer(lpBuffer);
std::regex rx("[^[:alnum:][:punct:][:space:]]+");
std::string fmt("\n\0");
std::regex_constants::match_flag_type fonly = std::regex_constants::format_first_only;
std::string result = std::regex_replace(buffer, rx, fmt, fonly);
wss << result.c_str();
}
SetWindowText(GetDlgItem(HwndMain, IDC_OUTPUT), LPCWSTR(wss.str().c_str())); }
【问题讨论】:
-
函数不应该返回读取的字节数吗?您可以清空缓冲区的其余部分。
-
确实如此,结果证明是正确的解决方案,但需要进行一项修改:我的缓冲区需要比传递给 ReadFile 的最大大小值大一个元素,这样我才能确保它始终为空终止。
标签: regex visual-studio-2010 winapi visual-c++