2017-09-02 11 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()

stdinが空であればQtで確認できますか?

+0

どのオペレーティングシステムでですか?そして、あなたは「スタンダード」が空であることを*正確に*意味していますか? –

答えて

3

ファイルの終わりに到達するまで、これは標準入力読んでいました

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

(私はLinuxの-or、少なくともPOSIX-オペレーティングシステムを想定しています)。だから、

myprogram < ./data.json 

のようなリダイレクト入力で動作します。しかし、私はその後、任意の「<」それがハングアップ...

しかし、(あなたは一人でmyprogramを実行する場合には、ある)せずにそれを呼び出す場合stdinではなく、が空です。シェルの標準と同じです。フォアグラウンドジョブであるあなたのプログラムは、入力している端末の入力を待っています(tty(4)も参照してください)。ターミナルで何らかの入力を試してみてください(Ctrl Dで終わり、ファイルの終わりの状態にすることができます)。 job controltty demystifiedについては、termios(3)も参照してください。

おそらく、あなたはその状況をたとえばisatty(3)STDIN_FILENO。しかし、それはpipe(7)

tail -55 somefile | myprogram 

のように検出されませんあなたは、空の標準入力があなたのために何であるかを定義する必要があります。私はそれがあなたにとってどういう意味か分かりません。そして、代わりに myprogram < /dev/nullnull(4)参照)を空の標準入力を得る方法と考えるでしょう。

おそらくmyprogramをデザインして、一部のプログラム オプション(おそらく--ignore-stdin)がstdinからの読み取りを避けるようにする必要があります。

2

ここに問題があります。 documentationを参照してください:

は、ストリームの全体の内容を読み込み、のQStringとして返します。 大容量ファイルを処理する場合は、 という量のメモリを消費するため、この機能は使用しないでください。それは、ファイルの終わりを検出するまで

は、だから、stdinを読み取り、stdinがコンソールに関連付けられているので、あなたは、ファイルの終了を通知しなければなりません。通常はCtrl-DでEnterキーを押します。

stdin行ごとに何を読むべきでしょうか。 ユーザテキスト編集コンソールを有効にするには、アプリケーションの標準入力に行単位でデータを転送します。これは、コンピュータがユーザーインターフェース(画面なし)としてプリンタしか持っていなかった時代のように設計されています。


ここで、JSONフォーム stdinコンソールをコンソールに接続し、コンソールにファイル情報を保存しないでください。

私はいくつかのSAXパーサを使用しますが、これはあなたにとっては複雑になります。 JSonの終了を検出するもう1つの方法はありますか?

あなたがこのアプローチを試すことができます(これは基本的な考え方ではなく、最終的な解決策であるので、カップルの欠点を持っている):

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); 
} 

どこ終端されていないと関連しているそれぞれのQJsonParseError::ParseError values(リンクドキュメントを参照してください)のための真のJSonNotTerminatedErrorリターンJSonデータ。

今、私はQFileにコンストラクタが必要ではないことを理解していますが、主なコンセプトは明確にする必要があります。 stdinからデータを読み取り、それが有効なJSonドキュメントであるかどうかを確認します。

+0

JSONの内容が行ごとに判読できない可能性があります –

+0

答えの主な目的は、問題の原因( 'stdin'に接続されたコンソールの性質)を指摘することでした。 QtはDOM JSonパーサのみを提供するので、JSonの終わりを発見する方法を見つけなければなりません。プロジェクトにSAXパーサが追加され、あなたには不幸があります。 –

関連する問題