[英]Reading data from stdin in C
我正在嘗試從stdin
讀取並輸出數據,但是一切正常,除了它沒有輸出新的傳入數據 。 我不太確定問題出在哪里。 我猜它在確定stdin
大小時有事可做。 任何幫助將不勝感激! 謝謝
tail -f file | my_prog
#include <stdio.h>
#include <sys/stat.h>
long size(FILE *st_in) {
struct stat st;
if (fstat(fileno(st_in), &st) == 0)
return st.st_size;
return -1;
}
int main (){
FILE *file = stdin;
char line [ 128 ];
while ( fgets ( line, sizeof line, file ) != NULL )
fputs ( line, stdout ); /* write the line */
long s1, s2;
s1 = size(file);
for (;;) {
s2 = size (file);
if (s2 != s1) {
if (!fseek (file, s1, SEEK_SET)) {
while ( fgets ( line, sizeof line, file ) != NULL ) {
fputs ( line, stdout ); /* write the line */
}
}
s1 = s2;
usleep(300000);
}
}
return 0;
}
編輯 :固定!
FILE *
到達EOF之后,它將保持在不再讀取任何數據的狀態,直到您用clearerr()
或fseek()
清除'EOF'位為止。 但是,如果將標准輸入連接到終端,則該設備不是可搜索的設備,因此除了清除錯誤之外,它可能沒有任何用處:
POSIX說:
fseek()在無法查找的設備上的行為是實現定義的。
您的循環進入條件是可疑的; 您需要在啟動之前先入睡,並且每次迭代都需要入睡。 確實,通常您編寫tail -f
無需擔心文件大小; 您入睡后,嘗試閱讀直到下一個'EOF',重設文件EOF指示器,然后重復。 還要注意,沒有定義管道或終端的尺寸。
單獨地,調用FILE *
參數到函數filename
慣例是; 它具有完全錯誤的含義。 文件名是一個字符串。
這不是真正的標准C:
size(file);
調用stat()獲取文件信息-文件的組織類型,文件大小和權限。
您的代碼要做的是最終在嘗試讀取文件時將文件指針設置為文件末尾。 考慮使用stat()(或在打開的文件上使用fstat())代替。
rewind()將文件指針重置為文件的開頭,fseek()會將其放置在您需要的任何位置。
tail -f在嘗試之間短暫睡眠的情況下,在EOF點反復嘗試文件。...並不“認為” EOF為錯誤。 它會記住EOF的當前文件偏移,然后使用SEEK_END記住fseeks(),然后調用ftell()並比較這些偏移。 如果存在差異,則fseek()-s返回最后一個已知的端點並讀取數據。
此說明來自舊的Unix來源。 我敢肯定,從那時起它已經被調整了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.