0

我有问题,尝试使用 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选项,我认为这应该没问题。

4

1 回答 1

1

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

评论:

  1. 要包含 Qt 类Class,请使用#include <QClass>,而不是#include <QtModule/QClass>
  2. 您可以包含整个 Qt 模块以减少显式包含的数量,例如#include <QtCore>对于控制台应用程序就足够了。
  3. 您不需要使用QCoreApplication实例QTextStream(请注意QApplicationis-a QCoreApplication!)。
  4. stdoutstdin来自<cstdio>标题。你不需要<iostream>
  5. 在项目文件以及您的代码中,您不需要添加模块依赖项,只需添加顶级模块即可。例如,如果您使用除 之外的任何模块core,则无需显式添加该core模块,因为所有其他模块都依赖于它。如果widgets在 Qt 5 中添加模块,则不需要添加gui模块。等等。

有两种方法可以将控制台分配给您的进程:

  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
    

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

重要的提示

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

项目的上下文菜单

为了简化这一点,只需擦除构建文件夹。

于 2016-10-17T13:37:58.770 回答