2017-09-24 206 views
0

我想寫一個C代碼(在Ubuntu Linux操作系統上運行),它連續讀取標準輸入,並且每次接收不同長度的字節。每當接收緩衝區每次達到或超過15時,它都需要以15字節長的數組發送回標準輸出。閱讀()從標準輸入讀取流

守則草案

#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個回顯命令來表示它。

同時添加預期的輸出,以及當前草稿代碼的實際輸出。任何意見或建議有預期的輸出(可能是另一種功能,而不是閱讀和printf?),將不勝感激。

情景

端子1:

mkfifo /tmp/MyPipe 
tail -f /tmp/MyPipe | ./StreamProcess 

端子2:

echo -ne '1234567890' >> /tmp/MyPipe 
echo -ne 'abcdefghij' >> /tmp/MyPipe 
echo -ne 'qwertyuiop' >> /tmp/MyPipe 

上的終端1的預期輸出

第一回波後:沒什麼克打印

第二回波之後:

Part 1:1234567890abcde 

第三回波之後:

Part 1:1234567890abcdePart 2:fghijqwertyuiop 

電流輸出(與代碼草案)上的終端1

第一回波後:無打印

第二次回聲後:

Part 1:1234567890s·  s·Part 2:abcdefghijs· s· 

第三回波之後:(只有$提示印刷)

Part 1:1234567890s·  s·Part 2:abcdefghijs· s·$ 
+0

這是特定於操作系統(你可能使用POSIX或Linux)。閱讀[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)並編輯您的問題以改進它(至少通過告訴您正在編寫哪個操作系統) –

+2

1)'char buff [100];'buff未初始化2)'read(STDIN_FILENO,buff,15);'read返回一個值。用它! 3)'printf(「Part 1:%s」,buff);'buff不一定是nul-terminated。另外:向格式字符串添加'\ n'。 ' – wildplasser

+0

@wildplasser緩衝區是否未預先初始化,除非它在全局範圍內?我的理解是需要放置空終止符,但不需要將緩衝區置零。 – synchronizer

回答

0

鑑於該問題所列的標準,下面的代碼將執行所需操作。

編輯:納入意見的問題。

編輯:添加錯誤檢查

#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部分:ABCDEFGHIJ 第3部分:QWERTYUIOP –

+0

@JimRaynor,爲什麼添加語句:'#包括'?我的答案和發佈的代碼中沒有任何內容需要該頭文件中的任何內容。 – user3629249