ここから本文です

ReadFile()のような関数を用いて1行単位で文字列を取得する方法

fre********さん

2011/8/1912:17:54

ReadFile()のような関数を用いて1行単位で文字列を取得する方法

win32api で子プロセスを生成し、そのプロセスの標準出力の出力先をhPipeReadにリダイレクトしました。
これまでReadFileを用いて以下のように1文字ずつ出力を取得してましたが、
これを1行単位で取得したいです。
どうすればいいでしょうか


HANDLE hPipeRead;
char lpBuffer[256];
DWORD nbytesRead;

ReadFile(hPipeRead, lpBuffer, 1,
&nBytesRead, NULL)

補足言葉が足りなくてすみません。
パイプからの読み取り以外の部分のプログラムの部分が既にそれなりに
できているのでパイプの出力側のHANDLE から1行単位で文字列を取得する
方法について知りたいです。

閲覧数:
5,737
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

tad********さん

2011/8/2123:40:41

文字コードのことは考えず1文字ずつ読み込む今の方法で良ければラッパー関数を作るのが良いかと思います。

char buf[2048]; // バッファの溢れが無いという前提
int num_readed=0;
bool yn_eof = false;
const char* get_one_line_from_pipe( HANDLE hPipeRead)
{
// 0x0a で行末と見なす。行末の 0x0d 0x0a は除去。
DWORD nBytesRead;
BOOL b;
BYTE lpBuffer[1];
if(yn_eof) return NULL;
while( 1) {
b=ReadFile(hPipeRead, lpBuffer, 1, &nBytesRead, NULL) ;
if( b == FALSE && GetLastError() == ERROR_BROKEN_PIPE) {
yn_eof = true;
if( num_readed == 0) return NULL;
buf[num_readed]=0;
return buf;
}
else if( b == FALSE) {
// エラー処理
return NULL;
}
if( lpBuffer[0] == 0x0a) {
buf[num_readed]=0;
if( num_readed>0 && buf[num_readed-1]==0x0d) buf[num_readed-1]=0;
return buf;
}
}
return NULL; // ここには来ない
}

質問した人からのコメント

2011/8/24 07:52:11

助かりました。
ありがとうございます

ベストアンサー以外の回答

1〜1件/1件中

2011/8/1915:51:27

fgets みたいに改行区切りで読み込みたいということでしょうか?
popen ( Visual Studio なら _popen、_wpopen ) でパイプを作成して fgets すると良いと思います。

MSDN:_popen、_wpopen
http://msdn.microsoft.com/ja-jp/library/96ayss4b(v=vs.71).aspx

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる