0

我正在使用 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())); }
4

1 回答 1

1

我不确定用正则表达式修复它是否正确。我相信你应该\0在输入完成的地方放一个,你可以通过检索读取的字符数来找出位置。

但是,这些是可打印的(非垃圾)ASCII 字符集:

[ -~]

这是从空格到波浪号的字符集。

所以这是所需的模式:

[^ -~]+
于 2013-02-27T05:18:47.033 回答