使用QTextStream从控制台

时间:2016-10-17 13:01:32

标签: c++ qt console-application qtextstream

我遇到问题,在尝试使用QTextStream进行数据读取或写入控制台时出现访问冲突

  

ApplicationStub.exe中0x77BD1D76(ntdll.dll)的第一次机会异常:0xC0000005:
访问冲突写入位置0x00000014。

     

ApplicationStub.exe中0x77BD1D76(ntdll.dll)的未处理异常:   0xC0000005:
访问冲突写入位置0x00000014。

我的计划很简单:

#include <QtWidgets/QApplication>
#include <iostream>
#include <QTextStream>
#include <stdio.h>

using namespace std;

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

        QApplication app(argc, argv);

        ///////////////////////////////////////////////CONSOLE

        QTextStream out(stdout);
        out << "Please enter login username and password\n";
        out.flush();


        QTextStream in(stdin);
        QString line;
        in >> line;

        return app.exec();

}

可能是什么问题? 感谢

修改1 我也尝试过QCoreApplication 我正在使用Visual Studio 2013,Windows 7

同样在我的 .pro 文件中,我有:

QT += console
QT += core gui

我有gui for gui选项,我认为这应该没问题。

1 个答案:

答案 0 :(得分:1)

代码中没有任何问题,但可以清理一下。您很可能不会将其构建为控制台应用程序,因此它在没有控制台的情况下启动,并且任何访问不存在的控制台的尝试都会失败。

评论:

  1. 要包含Qt课程Class,请使用#include <QClass>,而不是#include <QtModule/QClass>
  2. 您可以包含整个Qt模块以减少显式包含的数量,例如: #include <QtCore>足以用于控制台应用程序。
  3. 您不需要QCoreApplication个实例来使用QTextStream(请注意QApplication是一个QCoreApplication!)。
  4. stdoutstdin来自<cstdio>标题。您不需要<iostream>
  5. 在项目文件和代码中,您不需要添加模块依赖项,只需要添加顶级模块。例如。如果您使用core以外的任何模块,则不需要显式添加core模块,因为所有其他模块都依赖于它。如果您在Qt 5中添加widgets模块,则无需添加gui模块。等等。
  6. 有两种方法可以为您的流程分配控制台:

    1. CONFIG += console添加到qmake项目文件中。这样,您的进程在启动时将始终具有控制台窗口:

      # test1.pro
      QT = core
      CONFIG += console c++11
      CONFIG -= app_bundle
      TARGET = test1
      TEMPLATE = app
      SOURCES += main.cpp
      

      您的代码现在可以正常工作:启动时,您会看到一个控制台窗口打开。

    2. 在GUI应用程序中显式分配控制台。控制台窗口仅在您需要时出现,而不是默认情况下出现:

      # test1.pro
      QT = widgets      # or core if you don't care for a graphical interface
      CONFIG += c++11
      TARGET = test1
      TEMPLATE = app
      SOURCES += main.cpp
      

      <强>的main.cpp

      #include <QtCore>
      #include <cstdio>
      #include <windows.h>
      
      void addConsole() {
        AllocConsole();
        freopen("CON", "wt", stdout);
        freopen("CON", "wt", stderr);
        freopen("CON", "rt", stdin);
      }
      
      int main() {
        addConsole();
        QTextStream out{stdout};
        QTextStream in{stdin};
      
        out << "Enter your name: " << flush;
      
        QString name;
        in >> name;
        out << "Your name is: " << name << "." << endl;
        QThread::sleep(1);
      }
      
    3. 重要提示

      对项目文件进行任何更改后,您需要重新运行qmake 重建项目。

      context menu of the project

      为简化此操作,只需删除构建文件夹即可。