Access violation error when using QTextStream to read from console

0

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.

c++
qt
console-application
qtextstream
asked on Stack Overflow Oct 17, 2016 by (unknown user) • edited Oct 17, 2016 by (unknown user)

1 Answer

1

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, e.g. #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. E.g. 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.

context menu of the project

To simplify this, simply erase the build folder.

answered on Stack Overflow Oct 17, 2016 by Kuba hasn't forgotten Monica • edited Oct 17, 2016 by Kuba hasn't forgotten Monica

User contributions licensed under CC BY-SA 3.0