私はstdinから連続して読み込み、毎回さまざまな長さのバイトを受け取るCコード(Ubuntu Linux OS上で動作する)を記述しようとしています。受信バッファが毎回15に達するか15を超えると、15バイト長の配列でstdoutに返す必要があります。シナリオに例を与えることstdinからストリームを読み込むためのread()
ドラフトコード
#include <stdio.h>
#include <unistd.h>
int main()
{
char buff[100];
// Round 1
read(STDIN_FILENO, buff, 15);
printf("Part 1:%s", buff);
// Round 2
read(STDIN_FILENO, buff, 15);
printf("Part 2:%s", buff);
return 0;
}
。私たちは30バイトを3バッチと10バイトで受け取っています。下の例のシナリオでは、これを表すために3つのエコーコマンドを使用しました。
予想される出力と現在のドラフトコードの実際の出力を追加します。予想される出力(readとprintfではなく、別の関数かもしれません)を持つコメントや提案はありがたいです。
シナリオ
ターミナル1:
mkfifo /tmp/MyPipe
tail -f /tmp/MyPipe | ./StreamProcess
ターミナル2:ターミナル1の
echo -ne '1234567890' >> /tmp/MyPipe
echo -ne 'abcdefghij' >> /tmp/MyPipe
echo -ne 'qwertyuiop' >> /tmp/MyPipe
の予想される出力
第一エコー後:ナッシンgが2エコー後
を印刷さ:
Part 1:1234567890abcde
3エコー後:なし:第1エコー後ターミナル1
に(ドラフトコード付き)
Part 1:1234567890abcdePart 2:fghijqwertyuiop
電流出力
第2エコー後:
Part 1:1234567890s· s·Part 2:abcdefghijs· s·
が3エコー後:質問に記載されている基準所与
Part 1:1234567890s· s·Part 2:abcdefghijs· s·$
をチェックします。 [poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)を読んで質問を編集してください(少なくともあなたがコーディングしているOSを教えて) –
1) 'char buff [100];' buffが初期化されていない2) 'read(STDIN_FILENO、buff、15);' readは値を返します。これを使って! 3) 'printf(" Part 1:%s "、buff);' buffは必ずしもヌルで終了するとは限りません。また、 '\ n'を書式文字列に追加します。 ' – wildplasser
@wildplasserグローバルスコープ内にない限り、バッファはあらかじめ初期化されていませんか?私の理解では、ヌルターミネータを配置する必要がありますが、バッファをゼロにする必要はありません。 – synchronizer