我想寫一個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·$
這是特定於操作系統(你可能使用POSIX或Linux)。閱讀[poll(2)](http://man7.org/linux/man-pages/man2/poll.2.html)並編輯您的問題以改進它(至少通過告訴您正在編寫哪個操作系統) –
1)'char buff [100];'buff未初始化2)'read(STDIN_FILENO,buff,15);'read返回一個值。用它! 3)'printf(「Part 1:%s」,buff);'buff不一定是nul-terminated。另外:向格式字符串添加'\ n'。 ' – wildplasser
@wildplasser緩衝區是否未預先初始化,除非它在全局範圍內?我的理解是需要放置空終止符,但不需要將緩衝區置零。 – synchronizer