• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed [Qt] Problem z otwarciem pliku

Object Storage Arubacloud
0 głosów
810 wizyt
pytanie zadane 8 lipca 2017 w C i C++ przez niezalogowany
zamknięte 9 lipca 2017

Obojętnie ile nie zrobię nowych projektów, to za każdym razem wyświetla mi się błąd otwarcia pliku.

#include "mainwindow.h"
#include <QApplication>
#include <QObject>
#include <QString>
#include <QFile>
#include <QTextStream>
#include <QIODevice>
#include <QDebug>
#include <QDialog>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    QFile file("abc.txt");
    if( !file.open(QIODevice::ReadOnly | QIODevice::Text) )
    {
        qDebug() << "Błąd otwarcia";
    }

    QTextStream in(&file);
    while(!in.atEnd())
    {
        qDebug() << "Działa";
        QString line = in.readLine();
        qDebug() << line;
    }
    file.close();

    return a.exec();
}

Wcześniej napisałem taką funkcję żeby nie musieć rezygnować podczas pisania w Qt ze starego przyzwyczajenia

bool getline(QFile &file, QString &line)
{
    static QTextStream in(&file);

    if( !in.atEnd() )
    {
        line = in.readLine();
        return true;
    }

    return false;
}

I obydwie wersje kodu jak najbardziej, zadziałały mi. Ale później wszystko przestało działać. Czy to możliwe, że uszkodziłem w jakiś sposób biblioteki Qt? Próbowałem tworzyć ręcznie pliki o różnych nazwach i nic to nie dawało, za każdym razem jest błąd otwarcia jakiegokolwiek pliku.

Pomocy.

komentarz zamknięcia: Znaleziono rozwiązanie

4 odpowiedzi

0 głosów
odpowiedź 8 lipca 2017 przez j23 Mędrzec (194,920 p.)
A jak dasz pełną ścieżkę do pliku, to działa?
0 głosów
odpowiedź 8 lipca 2017 przez Bondrusiek Maniak (61,370 p.)

Cześć,

napisałem program, skompilowałem i mi działa

#include <iostream>
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QDebug>
using namespace std;

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);

    QFile file("C:\\Users\\Desktop\\abc.txt");

    if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        qDebug() << "Bład otwarcia";
    }

    QTextStream stream(&file);
    while (!stream.atEnd()) {
        QString text = stream.readLine();
        qDebug() << text;
    }
    file.close();
    return app.exec();
}

Prawdopodobnie masz problem ze ścieżką do pliku. Kliknij PPM na plik, Właściwości, skopiuj ścieżkę i dodaj nazwę pliku. Wtedy powinno być dobrze.

0 głosów
odpowiedź 8 lipca 2017 przez niezalogowany
Ani ścieżka względna, ani bezwzględna nadal nie działają nawet po ponownym uruchomieniu laptopa.
komentarz 9 lipca 2017 przez j23 Mędrzec (194,920 p.)

A co zwraca file.errorString()?

 

komentarz 9 lipca 2017 przez niezalogowany
"No such file or directory". Jednak gdy przeniosłem plik z folderu z projektem do folderu build to zadziałało. Nie wiem czemu tak, jestem pewien, że wcześniej miałem pliki tylko w folderze z projektem i działało (jak odpalałem z poziomu kompilatora) i dopiero jak wszystko dobrze śmigało to kopiowałem do folderu build. Ale ważne, że już działa.
komentarz 9 lipca 2017 przez j23 Mędrzec (194,920 p.)
edycja 9 lipca 2017 przez j23

To dziwne, bo pisałeś, że:

Każdy możliwy plik w każdym możliwym projekcie bez względu na rodzaj ścieżki nie chcę się otworzyć.

Jak byś dał pełną ścieżkę - tak, jak sugerowałem na początku - to plik otworzyłby się. Nie zrobiłeś tego, a pisałeś, że zrobiłeś frown

 

Aplikacje odpalane pod kontrolą środowiska mogą mieć ustawiony inny katalog roboczy niż ten, w którym znajduje się exek. Dlatego zawsze sugeruje używanie pełnych ścieżek.

komentarz 9 lipca 2017 przez niezalogowany
Podczas moich zmagań dałem C:\\Users\\Desktop\\abc.txt a powinienem dać po prostu Pulpit\\abc.txt i wtedy faktycznie cała ścieżka działa. W każdym razie dzięki za tą funkcję errorString(), chyba będę jej teraz używał jako tekst MessageBoxa przy nieudanej próbie odczytu.
komentarz 9 lipca 2017 przez j23 Mędrzec (194,920 p.)

Podczas moich zmagań dałem C:\\Users\\Desktop\\abc.txt

Nie wiem, jak u Ciebie jest, ale u mnie takiej ścieżki nie ma (brak katalogu użytkownika).

0 głosów
odpowiedź 9 lipca 2017 przez niezalogowany
Znalazłem rozwiązanie, wystarczyło przenieść pliki z folderu projektem do folderu build. Jednak zanim zamknę temat, chciałbym się dowiedzieć czy kod tej mojej funkcji getline jest bezpieczny? Nie zawiera w sobie jakiś złych praktyk koderskich? Pytam bo często wpadam na różne pomysły i nie w każdym przypadku są one dobre.
komentarz 9 lipca 2017 przez j23 Mędrzec (194,920 p.)

Nie jest bezpieczny z dwóch powodów:

  1. strumieniowi in przypisujesz obiekt file tylko raz, przy pierwszym wywołaniu. Strumień będzie cały czas w pamięci, a file może zniknąć (bo np. jest lokalny). I co wtedy?
  2. brak synchronizacji.

Generalnie ta funkcja nie ma sensu.

 

komentarz 9 lipca 2017 przez Bondrusiek Maniak (61,370 p.)

Witam,

Znalazłem rozwiązanie, wystarczyło przenieść pliki z folderu projektem do folderu build.

To pewnie źle pisałeś ścieżki do pliku. Qt udostępnia zasoby binarne w postaci .qrc. Czyli dopisujesz plik do projektu. Wtedy nie musisz się bardzo martwić o ścieżkę, gdyż sam możesz ją ustawić. Przykład:

https://www.youtube.com/watch?v=sWIQIi4lg58

Sama funkcja nie ma sensu. W dokumentacji masz :

http://doc.qt.io/qt-4.8/qtextstream.html#readLine

napisane, że metoda

QString QTextStream::readLine(qint64 maxlen = 0)

zwraca null jeśli nie może odczytać linii.

while(!in.atEnd())
{
   if(line = in.readLine())
  {
//udało się odczytać linie
  }
   else
   {
//nie udało się odczytać linii
   }
}

 

komentarz 9 lipca 2017 przez niezalogowany
W sumie to zauważyłem, że atEnd() działa w pewnym sensie podobnie jak getline, a nie jak to głupie eof() (chodzi mi o to, że jeśli ostatnia linijka jest pusta to znaczy, że już jesteśmy na końcu i nie pobieramy tej pustej niepotrzebnej linijki) a to mi jak najbardziej odpowiada, więc w sumie nie muszę tworzyć żadnego własnego qtgetlina.
komentarz 9 lipca 2017 przez Bondrusiek Maniak (61,370 p.)
Jeśli nie jesteś pewien to obserwuj dokumentacje, która jest dobrze opisana. Z reguły metoda, która jest odpowiedzialna za wykonanie jakiejś akcji to przeważnie zwraca jakąś wartość po której możesz zaobserwować czy wszystko poszło dobrze czy źle.
komentarz 9 lipca 2017 przez niezalogowany

Jeśli zwraca null gdy nie może odczytać to mogę zamiast tego

while(!in.atEnd())
{
   if(line = in.readLine())
  {
//udało się odczytać linie
  }
   else
   {
//nie udało się odczytać linii
   }
}

napisać o wiele wygodniejsze to:

while( (line = in.readLine()) != 0 )
{
   // do something with line
}
komentarz 9 lipca 2017 przez Bondrusiek Maniak (61,370 p.)
Tak, możesz tworzyć różne kombinacje. Najważniejsze aby prostota szła w parze z czytelnością.

Podobne pytania

0 głosów
1 odpowiedź 141 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez chomek Gaduła (4,500 p.)
0 głosów
4 odpowiedzi 141 wizyt
0 głosów
2 odpowiedzi 126 wizyt
pytanie zadane 8 maja 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...