I have problem, got access violation when trying to use QTextStream for data reading or writing to console:
First-chance exception at 0x77BD1D76 (ntdll.dll) in ApplicationStub.exe: 0xC0000005:
Access violation writing location 0x00000014.Unhandled exception at 0x77BD1D76 (ntdll.dll) in ApplicationStub.exe: 0xC0000005:
Access violation writing location 0x00000014.
My program is simple:
#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();
}
What could be the problem? Thanks
Edit 1 I also tried QCoreApplication I am using Visual studio 2013, Windows 7
Also in my .pro file I have:
QT += console
QT += core gui
I have there gui for gui option, i think this should be ok.
There is no problem at all in the code, though it could be cleaned up quite a bit. Most likely you're not building it as a console application, thus it starts without a console, and any attempts to access the non-existent console fail.
Comments:
Class
, use #include <QClass>
, not #include <QtModule/QClass>
.#include <QtCore>
would be sufficient for a console application.QCoreApplication
instance to use QTextStream
(note that QApplication
is-a QCoreApplication
!).stdout
and stdin
come from the <cstdio>
header. You don't need <iostream>
.core
, you don't need to explicitly add the core
module since all other modules depend on it. If you add the widgets
module in Qt 5, you don't need to add the gui
module. And so on.There are two ways to assign a console to your process:
Add CONFIG += console
to the qmake project file. That way your process will always have a console window upon startup:
# test1.pro
QT = core
CONFIG += console c++11
CONFIG -= app_bundle
TARGET = test1
TEMPLATE = app
SOURCES += main.cpp
Your code will now work fine: on startup, you'll see a console window open.
Explicitly allocate a console in a GUI application. The console window will appear only when you need it, and not by default:
# 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);
}
After making any changes to the project file, you need to re-run qmake and rebuild the project.
To simplify this, simply erase the build folder.