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 に答える