简体   繁体   中英

Access violation error when using QTextStream to read from console

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:

  1. To include a Qt class Class , use #include <QClass> , not #include <QtModule/QClass> .
  2. You can include an entire Qt module to reduce the number of explicit includes, eg #include <QtCore> would be sufficient for a console application.
  3. You don't need a QCoreApplication instance to use QTextStream (note that QApplication is-a QCoreApplication !).
  4. stdout and stdin come from the <cstdio> header. You don't need <iostream> .
  5. In the project file as well as in your code, you don't need to add module dependencies, only the top-level modules. Eg if you're using any module other than 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:

  1. 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.

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

Important Note

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM