Bartex321 Temat założony przez niniejszego użytkownika |
[QT] Druga próba otwarcia pliku » 2020-03-07 16:23:06 Witam, chciałbym zaprogramować, aby tworzył się nowy plik, jeśli plik już istnieje, to ma się on otworzyć bez zawartości: QFile plik( "C:/plik.txt" ); if( !plik.open( QIODevice::NewOnly ) ) { if( !plik.open( QIODevice::Truncate ) ) return; }
plik.close();
Niestety, jeśli plik już istnieje i wejdzie do pierwszego if-a, to zawsze wykonuje się return, tzn nie ma sytuacji, w której otworzenie pliku w trybie newonly się nie udaje, natomiast w w trybie truncate już działa(tak powinno być, gdy plik istnieje). Po kilku próbach debugowania i znalezienia odpowiedzi w internecie doszedłem do wniosku, że polecenie "plik.open(QIODevice::NewOnly)" wywołuje coś, co uniemożliwia ponowne otwarcie pliku (jakaś flaga błędu?). Próbowałem przed "if (!plik.open(QIODevice::Truncate))" wpisać "plik.close();", ale nic to nie zmienia |
|
killjoy |
» 2020-03-07 17:59:22 Czemu nie otwierasz pliku po prostu z flagą QIODevice::WriteOnly, zamiast stosować jakieś dziwne konstrukcje? O ile dobrze zrozumiałem, takie użycie robi dokładnie to co chcesz osiągnąć - jeżeli plik istnieje, nadpisze jego zawartość, jeżeli nie, stworzy nowy: QFile::open()Open mode flags |
|
Bartex321 Temat założony przez niniejszego użytkownika |
» 2020-03-07 19:26:46 Przepraszam widać źle opisałem - new only tworzy nowy plik, a truncate otwiera istniejacy i usuwa całą zawartość, czyli w obu przypadkach otrzumuje pusty plik. Piza tym nie moge tego zrobic jedna instrukcja, poniewaz jesli plik nie istnieje to po prostu ho tworze, a gdy istnieje pytam uzytkownika co z nim zrobic |
|
killjoy |
» 2020-03-08 12:56:54 To sprawdź, czy plik istnieje metodą QFile::exists(), skoro masz problem z NewOnly, a potem stwórz otwierając z flagą WriteOnly. |
|
Bartex321 Temat założony przez niniejszego użytkownika |
» 2020-03-08 14:03:07 Właśnie nie mam problemu z NewOnly, problem jest, gdy plik istnieje Jeżeli plik o danej nazwie nie istnieje to NewOnly go tworzy i program nie wchodzi do żadnego if-a, ale gdy plik istnieje to plik.open( QIODevice::NewOnly ) zwraca 0 i kod wchodzi do pierwszego if-a(poprawnie), a następnie plik.open( QIODevice::Truncate ) również zwraca 0 i wykonuje się return, co już nie powinno mieć miejsca |
|
killjoy |
» 2020-03-08 16:32:13 Spróbuj dorzucić flagę WriteOnly do flagi Truncate. Może trzeba jawnie powiedzieć Qt jakiego dostępu potrzebujesz do pliku, choć nie widzę nigdzie tego sprecyzowanego w dokumentacji. Sam nie mam jak teraz tego sprawdzić. Alternatywnie możesz zrobić resize(0) na otwartym pliku, zamiast ponownie otwierać z flagą Truncate. A i zamknij plik przed ponownym otwarciem. |
|
Bartex321 Temat założony przez niniejszego użytkownika |
» 2020-03-08 17:47:33 Dzięki, faktycznie działa, choć nie mam pojęcia czemu nie napisali tego w dokumentacji i po co to jest skoro na logikę, jeśli czyszczę plik, to będe chciał zapisać w nim coś innego PS: nie trzeba zamykać pliku, jeśli plik istnieje, to NewOnly go nie otworzy |
|
« 1 » |