2017-09-02 52 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解析器对你来说会过度。 –