QT Stream i metoda readline()

0

Witam, uczę się aktualnie frameworka QT dla C++ i niestety napotkałem pewne problemy, z którymi nie potrafię sobie poradzić. Proszę was o pomoc. Problem jest następujący:


QTextStream cout(stdout);
QTextStream cin(stdin);
QTextStream cerr(stderr);

 QString filename;

   cout << "Podaj nazwę pliku: " << flush;
   cin >> filename;

   cout << "Wpisana nazwa pliku to: " << filename << endl;

// ...

QString users_text;

       cout << "Podaj tekst do wpisania do pliku: ";
       users_text=cin.readLine();

       cout << "Wpisany tekst to: " << users_text << endl;

// ...

Problem jest taki, że cin.readLine(); nie czyta mi nic - zwraca pusty QString. Jak zrobiłem sobie przykładowy program, gdzie stworzyłem sobie tylko jedną zmienną QString i strumień cin i użyłem ich bezpośrednio to wszystko grało.


#include <QString>
#include <QTextStream>

QTextStream cin(stdin);
QTextStream cout(stdout);
QTextStream cerr(stderr);

int main(int argc, char *argv[])
{
    QString somestring;

    somestring = cin.readLine();

    cout << somestring << endl;

    return 0; // tu wszystko gra
}

Próbowałem również wstawiać cin.flush(), bo myślałem, że może w buforze coś zostało, ale tak nie jest.

//... to fragmenty kodu które nie są związane ze streamem i które nie powinny mieć znaczenia dla pokazanego tutaj problemu.

Zanim zostanę odesłany do dokumentacji, to byłem i patrzyłem tam, ale niestety nie potrafiłem znaleźć interesującej mnie informacji. w opisie przeciążonego operatora >> dla argumentu QString & nie jest napisane, czy zostawia cokolwiek w buforze, ale z tego co się zorientowałem to bufor jest czyszczony. Jedyne co przeczytałem, to to, że metoda readLine() zwraca pusty string jeśli doczyta do końca pliku, ale ja nawet nie mam szansy nic wpisać, więc nawet nie mam jak klawiaturowo zasymulować końca pliku. Stąd proszę was o pomoc.

Z góry dziękuję i pozdrawiam :)

1

Czytamy dokumentację ;)

QTextStream::flush napisał(a)

If QTextStream operates on a string, this function does nothing.

cin >> filename;

Tutaj wyjmujesz słowo ze strumienia (nazewnictwo masz szalenie mylące, btw). Nie wyjmujesz nic więcej.

Więc jeśli podałeś jeden\n to w strumieniu wciąż zostaje \n. Jeśli byś podał jeden dwa\n, to w strumieniu zostanie dwa\n, co można łatwo zauważyć:
user image

W zależności od tego co chcesz zrobić, po pierwszym odczycie albo wywołaj QTextStream::readLine() aby pozbyć się resztek obecnej linii, albo QTextStream::skipWhiteSpace(), aby zignorować wszystkie znaki do pierwszego niebędącego znakiem białym (http://qt-project.org/doc/qt-5/qtextstream.html#skipWhiteSpace).

1 użytkowników online, w tym zalogowanych: 0, gości: 1