2017-09-02 68 views
1

我有處理類似這樣的標準輸入數據Qt的程序:有了Qt,如何檢查stdin是否爲空?

QTextStream qtin(stdin); 
QString stdindata = qtin.readAll(); 
QByteArray ba; 
ba = stdindata.toUtf8(); 
QJsonDocument exJSONDoc(QJsonDocument::fromJson(ba)); 
QJsonObject extRoot; 
extRoot = exJSONDoc.object(); 
QStringList keys; 
keys = extRoot.keys(); 
for (int n=0; n <= keys.count()-1; n++) 
{ 
    qDebug() << extRoot.value(keys[n]).toString(); 
} 

當我把我的計劃是這樣它的工作原理:

myprogram < ./data.json 

但如果我把它沒有任何「<」它掛起在qtin.readAll()

如何使用Qt檢查stdin是否爲空?

+0

在什麼操作系統上?而且,你的意思是「stdin是否爲空」? –

回答

3

(我假設一個Linux或者至少POSIX-操作系統)

QTextStream qtin(stdin); 
QString stdindata = qtin.readAll(); 

這將標準輸入讀取,直到達到-的文件末尾。因此,與像

myprogram < ./data.json 

重定向的輸入工作,但如果我把它沒有任何「<」它掛起...

但隨後(也就是說,如果你單獨運行myprogramstdin不是是空的。它與你的shell的stdin相同。而作爲前臺工作的您的程序正在等待您輸入的終端上的輸入(另請參閱tty(4))。嘗試(在這種情況下)在終端上鍵入一些輸入(您可以用Ctrl D結束以產生文件結束條件)。閱讀有關job controltty demystified,另請參閱termios(3)

也許你可以用例如isatty(3) on STDIN_FILENO。但是,這不會檢測pipe(7)

tail -55 somefile | myprogram 

您需要定義一個空的標準輸入是什麼給你的。我不知道這對你意味着什麼,而我會想到myprogram < /dev/null(請參閱null(4))作爲獲取空標準輸入的方式。

也許你應該設計myprogram以便某些程序 選項(或許--ignore-stdin)可以避免從標準輸入讀取任何內容。

2

這裏的問題是readAll。見documentation

讀取流的全部內容,並將其作爲一個的QString。 在處理大文件時避免使用此功能,因爲它會消耗大量的內存。

,所以它讀取stdin,直到它遇到文件結束以來stdin與控制檯關聯,你必須到文件末尾。通常它是Ctrl-D並按回車。

你很可能會逐行閱讀stdin。 要讓用戶文本編輯控制檯將數據逐行傳輸到應用程序的標準輸入。當計算機只有一臺打印機作爲用戶界面(無屏幕)時,這種設計就像很久以前一樣。


現在的問題是如何閱讀JSon表格 stdin控制檯連接控制檯沒有文件信息結束?

我會使用一些SAX解析器,但這對您來說會很複雜。 那麼還有另一種檢測JSon結束的方法嗎?

你可以試試這個方法(這是基本的想法,而不是最終的解決方案,所以它有幾個缺點):

QFile file(stdin); 
QByteArray data = file.peak(largeNumber); 
QJsonParseError error; 
QJSonDocument doc = QJSonDocument::fromJson(data, &error); 
while (!doc.isValid() && JSonNotTerminatedError(error.error)) 
{ 
    // TODO: wait for new data - it would be best to use readyRead signal 
    doc = QJSonDocument::fromJson(data, &error); 
} 

JSonNotTerminatedError返回true,爲各自的QJsonParseError::ParseError values(見鏈接文檔),這與未終止相關JSon數據。

現在我看到QFile沒有必要的構造函數,但主要概念應該清楚。從stdin讀取數據並檢查它是否是有效的JSon文檔。

+0

一個JSON內容不太可能被逐行讀取 –

+0

答案的主要目的是指出問題的根源(連接到'stdin'的控制檯的性質)。由於Qt只提供DOM JSon解析器,所以你必須找到方法來發現JSon的結束。添加到項目中的SAX解析器對你來說會過度。 –