Wczytywanie danych z pliku txt

0

Witam wszystkich serdecznie.
Jakiś czas temu postanowiłem poświęcić naukę c++ w kierunku QT i pojawił się delikatny kłopot, a mianowicie:
Chciałem napisać prosty Quiz .... W pliku tekstowym uporządkować pytanie, 4 odpowiedzi itd, ale nie mogę sobie poradzić z pewną sprawą. Chodzi o to, że powiedzmy przygotowuję około 10 zestawów pytań i jak zrobić aby program wczytał na przykład linie od 1 do 4, a po kliknięciu dalej wczytał od 5 do 8, a nie od początku. Jeśli można to prosiłbym o naprowadzenie, czy to kwestia parametru podczas otwarcia pliku, warunku w pętli while(osobiście wydaje mi się, że to kwestia tego atEnd, ale nie wiem czym zastąpić), czy może jeszcze inne rozwiązanie problemu. Oto kod:

void Dialog::on_pushButton_clicked()
{
    QFile file("C:/c++/qt/Quiz/pytania.txt");

    if(!file.open(QIODevice::ReadOnly))
    {
        ui->Tresc->setText("Nie znaleziono pliku z pytaniami.");
    }
    else
    {
        QString line;
        QTextStream stream(&file);
        while(!stream.atEnd())
        {
            line=stream.readLine();
            pytanie=line;
            line=stream.readLine();
            a=line;
            line=stream.readLine();
            b=line;
            line=stream.readLine();
            c=line;
            line=stream.readLine();
            d=line;
        }
    }
    ui->Tresc->setText(pytanie);
    ui->OdpA->setText(a);
    ui->OdpB->setText(b);
    ui->OdpC->setText(c);
    ui->OdpD->setText(d);
    file.close();
}

Dziękuję z góry za pomoc.
Pozdrawiam.

0

Oki, Doszedłem do wniosku, że ta pętla w ogóle sensu nie ma :) Oto poprawiony kod:

void Dialog::on_pushButton_clicked()
{
    QFile file("C:/c++/qt/Quiz/pytania.txt");

    if(!file.open(QIODevice::ReadOnly))
    {
        ui->Tresc->setText("Nie znaleziono pliku z pytaniami.");
    }
    else
    {
        QString line;
        QTextStream stream(&file);
            line=stream.readLine();
            pytanie=line;
            line=stream.readLine();
            a=line;
            line=stream.readLine();
            b=line;
            line=stream.readLine();
            c=line;
            line=stream.readLine();
            d=line;
    }
    ui->Tresc->setText(pytanie);
    ui->OdpA->setText(a);
    ui->OdpB->setText(b);
    ui->OdpC->setText(c);
    ui->OdpD->setText(d);
    file.close();
}

Pytanie jakie teraz mi się nasuwa, to jak zrobić, aby ustawić startową linię przy kolejnym wczytaniu danych z pliku, aby pominąć już te poprzednio wczytane.

0

Widzę, że dziś prowadzę monolog :)
Rozwiązałem problem tak zwanie łopatologicznie na zasadzie pętli .... oto kod:

void Dialog::on_pushButton_clicked()
{
    QFile file("C:/c++/qt/Quiz/pytania.txt");

    if(!file.open(QIODevice::ReadOnly))
    {
        ui->Tresc->setText("Nie znaleziono pliku z pytaniami.");
    }
    else
    {
        QString line;
        QTextStream stream(&file);
            for(int i=0; i<index; i++)
            {
                line=stream.readLine();
            }
            line=stream.readLine();
            pytanie=line;
            line=stream.readLine();
            a=line;
            line=stream.readLine();
            b=line;
            line=stream.readLine();
            c=line;
            line=stream.readLine();
            d=line;
    }
    ui->Tresc->setText(pytanie);
    ui->OdpA->setText(a);
    ui->OdpB->setText(b);
    ui->OdpC->setText(c);
    ui->OdpD->setText(d);
    index+=6;
}

Generalnie działa, ale czy nie ma możliwości językowych, aby bez pętli to zrobić, a po prostu na przykład otwierając plik przekazać, że ma czytać od n-linii ?

0

Poszukaj coś o funkcji seek w klasie QFile. seek ustawia wskaźnik na streama, coś jak kursor w edytorze pliku. Generalnie za każdym razem będziesz musiał znaleźć odpowiednią pozycję co jest mało wydajne.

Zastanów się czy nie lepiej przeparsować plik raz i wrzucić całą jego zawartość do ramu jako tablicę. Na przykład

struct q
{
    QString question;
    QString answers[4];
    int good_answer;
};

struct q questions[MAX_QUESTIONS];

Potem już sobie na spokojnie wyciągasz odpowiedni element z tablicy nie musząc tracić czasu na parsowanie pliku.

0

Napisz sobie funkcję, która przeskakuje o n linii, i będziesz miał „możliwość językową”.

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