Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

QT - Wczytywanie danych z pliku i zapisywanie do tablicy

Kutti 30 Maj 2013 22:05 3567 4
  • #1 30 Maj 2013 22:05
    Kutti
    Poziom 6  

    Witam. Potrzebuje wczytać dane z pliku .txt który jest w takim formacie:
    x; y
    0;0
    0.03;0.8087360606
    itd.
    Bede te dane wykorzystywal do rysowania wykresu w Qt w polaczeniu z OpenGL. I nie wiem jak wczytac te dane?
    Czy skorzystac z QFile, czy QByteArray? Chcialbym to zapisac do tablicy floatow zeby pozniej wygodnie odczytywalo sie dane i rysowalo wykres, no chyba ze sa jakies inne szatanskie sposoby w QT. Dopiero zaczynam zabawę z QT i chcialem doradzic sie jak to zrobic. Moze macie jakis maly przyklad z kodem?
    Z góry dziękuję i pozdrawiam :).

    0 4
  • #2 30 Maj 2013 22:52
    beluosus
    Poziom 25  

    Kutti napisał:
    Czy skorzystac z QFile, czy QByteArray?
    QByteArray to po prostu tablica bajtów i nie ma z plikiem nic wspólnego (poza tym, że można do niej wpisać zawartość, czegokolwiek).
    Co do parsowania pliku to będzie jakoś tak:
    Kod: cpp-qt
    Zaloguj się, aby zobaczyć kod

    PS
    Qt
    (QT to QuickTime).

    0
  • #3 31 Maj 2013 15:07
    Kutti
    Poziom 6  

    Oczywiście Qt ;p. Wszystko ładnie wyświetla tylko mam pytanie co do funkcjonalności tego kodu. Z każdą pętlą tworzony jest nowy obiekt typu QStringList i Qstring. Jeżeli chce to sobie wrzucić na jedną listę, żeby wartosci były pokolei to po prostu stworzyć poza pętlą zmienną QStringList, dodac jakis licznik zeby z wykonaniem każdej petli sie zwiekszal i indeksowac np. cos takiego zrobilem:

    Cytat:
    QFile file("C://wykres.txt");
    if (file.open(QFile::ReadOnly | QFile::Text))
    {
    int i=0;
    QTextStream stream(&file);
    stream.readLine(); // odkomentować jeśli pierwsza linia to "x; y"
    QStringList list;
    QString line;
    while (!stream.atEnd())
    {
    line = stream.readLine();
    list<<line.split(';');
    bool ok;
    double x = list[i].toDouble(&ok);
    double y = list[i+1].toDouble(&ok);
    qDebug << x << " : " << y;
    i++;
    }
    }

    To oczywiscie tylko taki roboczy kod, zeby zobaczyc czy wczytuje funkcja, na razie mam jakis problem z odczytaniem pliku .exe :).

    0
  • #4 01 Cze 2013 23:09
    elemo
    Poziom 13  

    Na samym początku chce nadmienić że sam się uczę, ale chyba jestem w stanie pomóc.
    Żeby mieć wygodny dostęp do danych stwórz strukturę w nagłówkach np. 'dane' i zadeklaruj tam x i y.
    Jak wchodzisz do pliku to najpierw przelicz ilość wierszy i zadeklaruj tablicę o takim rozmiarze. Następnie wróć na początek pliku i przypisuj dane do tablicy. Dzięki temu możesz uzyskać tablice floatów tak jak zamierzałeś i wygodny do niej dostęp (np. dane[i].x albo dane[i].y).
    W moim programie miałem duża ilość tablic do wczytania z plików txt i dzięki tej metodzie mogłem utrzymać porządek i przejrzystość kodu.

    0
  • #5 01 Cze 2013 23:19
    Kutti
    Poziom 6  

    Przy dużej ilości tablic to niezłe rozwiązanie, ale ja mam tylko 2 tablice. Zrobiłem ten kod inaczej, pisze w Qt wiec staram sie go wykorzystac :):

    Cytat:
    QFile file("C://wykres.txt");
    if (file.open(QFile::ReadOnly | QFile::Text))
    {
    // int i=0;
    QTextStream stream(&file);
    stream.readLine(); // odkomentować jeśli pierwsza linia to "x; y"
    QStringList list;
    QString line;
    while (!stream.atEnd())
    {
    line = stream.readLine();
    list<<line.split(';');

    }

    A tak wygląda sam wycinek kodu rysujący w opengl:
    Cytat:

    glBegin(GL_LINE_STRIP);
    for(int j=0; j<list.size()/2; j++)
    {
    glVertex2f(list[2*j].toFloat(&ok), list[2*j+1].toFloat(&ok));
    }
    glEnd();

    0