我遇到问题,在尝试使用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选项,我认为这应该没问题。
答案 0 :(得分:1)
代码中没有任何问题,但可以清理一下。您很可能不会将其构建为控制台应用程序,因此它在没有控制台的情况下启动,并且任何访问不存在的控制台的尝试都会失败。
评论:
Class
,请使用#include <QClass>
,而不是#include <QtModule/QClass>
。#include <QtCore>
足以用于控制台应用程序。QCoreApplication
个实例来使用QTextStream
(请注意QApplication
是一个QCoreApplication
!)。stdout
和stdin
来自<cstdio>
标题。您不需要<iostream>
。core
以外的任何模块,则不需要显式添加core
模块,因为所有其他模块都依赖于它。如果您在Qt 5中添加widgets
模块,则无需添加gui
模块。等等。有两种方法可以为您的流程分配控制台:
将CONFIG += console
添加到qmake项目文件中。这样,您的进程在启动时将始终具有控制台窗口:
# test1.pro
QT = core
CONFIG += console c++11
CONFIG -= app_bundle
TARGET = test1
TEMPLATE = app
SOURCES += main.cpp
您的代码现在可以正常工作:启动时,您会看到一个控制台窗口打开。
在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);
}
对项目文件进行任何更改后,您需要重新运行qmake 并重建项目。
为简化此操作,只需删除构建文件夹即可。