C++ 查找std::cin的结尾返回-1错误和错误位

C++ 查找std::cin的结尾返回-1错误和错误位,c++,qt,c++11,stream,stdin,C++,Qt,C++11,Stream,Stdin,我正在尝试将Qt应用程序写入新创建的QProcess。Qt文档告诉我创建一个进程,并使用::write()函数写入新进程的标准输入。它不起作用,所以我在一个使用std::cin和stdin流的程序中尝试了一些基本测试 在main()中启动普通程序时,我执行以下操作: 使用C++ STD::ISTRAMAM,我做: std::cin.seekg(0, std::ios::end); // Or std::ios_base::end int result = std::cin.tellg(); //

我正在尝试将Qt应用程序写入新创建的QProcess。Qt文档告诉我创建一个进程,并使用::write()函数写入新进程的标准输入。它不起作用,所以我在一个使用std::cin和stdin流的程序中尝试了一些基本测试

在main()中启动普通程序时,我执行以下操作:

使用C++ STD::ISTRAMAM,我做:

std::cin.seekg(0, std::ios::end); // Or std::ios_base::end
int result = std::cin.tellg(); // Returns -1
bool isgood = std::cin.good(); // Returns false
我真的很困惑。首先,我想知道std::cin和stdin是否都是相同的流,即标准输入?一个是std::istream对象,另一个是我的VisualStudio上的文件typedef

我非常确定,查找到流的结尾不会设置错误位或EOF位,因为人们使用此方法查找到结尾,获取文件大小,然后查找回0,而不必清除()错误标志

我被告知的两行fseek(stdin,0,SEEK_END)和ftell(stdin)可用于检查标准输入是否为空,但fseek()返回-1错误。 我认为这是一个问题,我的系统,但我尝试了一个在线的C++编译器,我得到了很多相同的结果,唯一的区别是,在线编译器返回1 - fTele:(STDIN),而不是我的Visual Studio,返回0。
我还不能从我的qt应用程序写入标准输入,但是,我可以将stdin重定向到硬盘上的一个文件,这确实有效。非常感谢您的帮助。

我会尝试用Qt方式读取标准输入,例如

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFile in;
    in.open(stdin, QFile::ReadOnly);
    QTextStream stream(&in);

    QString line;
    while(true)
    {
        line = stream.readLine();
        if(!line.isEmpty())
        {
            QMessageBox::about(0, "stdin", line);
        }
    }
}
为了完整性起见,这也适用于读者端:

#include <QApplication>
#include <QMessageBox>
#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    std::string line;
    while(true)
    {
        std::getline(std::cin, line);
        QString data(line.c_str());
        if(!data.isEmpty())
        {
            QMessageBox::about(0, "stdin", data);
        }
    }
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
std::字符串行;
while(true)
{
std::getline(std::cin,line);
QString数据(line.c_str());
如果(!data.isEmpty())
{
QMessageBox::关于(0,“标准输入”,数据);
}
}
}

我会尝试用Qt方式读取标准输入,例如

#include <QApplication>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QFile in;
    in.open(stdin, QFile::ReadOnly);
    QTextStream stream(&in);

    QString line;
    while(true)
    {
        line = stream.readLine();
        if(!line.isEmpty())
        {
            QMessageBox::about(0, "stdin", line);
        }
    }
}
为了完整性起见,这也适用于读者端:

#include <QApplication>
#include <QMessageBox>
#include <iostream>
#include <string>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    std::string line;
    while(true)
    {
        std::getline(std::cin, line);
        QString data(line.c_str());
        if(!data.isEmpty())
        {
            QMessageBox::about(0, "stdin", data);
        }
    }
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
std::字符串行;
while(true)
{
std::getline(std::cin,line);
QString数据(line.c_str());
如果(!data.isEmpty())
{
QMessageBox::关于(0,“标准输入”,数据);
}
}
}

我认为
stdin
ftell()
不是很好的组合
std::cin
tellg()
也不是很好的组合。我找到了这个答案,这个答案可能很有趣:。(你可以通过谷歌搜索“c++cin tell”来找到更多。)我相信
stdin
ftell()
不是一个好的组合
std::cin
tell()
。我找到了这个答案,这个答案可能很有趣:。(你可以通过谷歌“c++cintellg”找到更多。)不,我忘了删除那一行。完成。不,我忘了删除那行。完成。