2017-09-24 12 views
0

私は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·$ 
+0

をチェックします。 [poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)を読んで質問を編集してください(少なくともあなたがコーディングしているOSを教えて) –

+2

1) 'char buff [100];' buffが初期化されていない2) 'read(STDIN_FILENO、buff、15);' readは値を返します。これを使って! 3) 'printf(" Part 1:%s "、buff);' buffは必ずしもヌルで終了するとは限りません。また、 '\ n'を書式文字列に追加します。 ' – wildplasser

+0

@wildplasserグローバルスコープ内にない限り、バッファはあらかじめ初期化されていませんか?私の理解では、ヌルターミネータを配置する必要がありますが、バッファをゼロにする必要はありません。 – synchronizer

答えて

0

(のみ$プロンプトが印刷される)、次のコードは、所望の動作を実行します。

編集:質問に組み込まれたコメント。

編集:追加のエラーこれは、オペレーティングシステムの特定の(おそらくPOSIXまたはLinuxを使用)である

#include <stdio.h> // printf(), STDIN_FILENO. perror() 
#include <unistd.h> // read(), exit(), EXIT_FAILURE 

#define MAX_READ_LEN 15 

int main(void) 
{ 
    char buff[ MAX_READ_LEN+1 ]; 
    int partNum = 0; 

    while(1) 
    { 
     // Round 1 
     ssize_t bytesRead = read(STDIN_FILENO, buff, MAX_READ_LEN); 

     if(0 > bytesRead) 
     { 
      perror("read failed"); 
      exit(EXIT_FAILURE); 
     } 

     // implied else, read successful 

     buff[ bytesRead ] = '\0'; 
     partNum++; 
     printf("Part %d:%s\n", partNum, buff); 
    } 

    return 0; 
} // end function: main 
+0

あなたの答えをありがとう。私は「#include 」を先頭に追加しました。 出力: パート1:1234567890 パート2: パート3 ABCDEFGHIJ:qwertyuiop –

+0

@JimRaynor、なぜそのステートメントを追加します: ''の#include ?私の答えや投稿されたコードには、そのヘッダファイルからのものは必要ありません。 – user3629249

関連する問題