Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[QT] Druga próba otwarcia pliku

Ostatnio zmodyfikowano 2020-03-08 17:47
Autor Wiadomość
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:
C/C++
QFile plik( "C:/plik.txt" );
if( !plik.open( QIODevice::NewOnly ) )
{
    if( !plik.open( QIODevice::Truncate ) )
         return;
   
}
// kod do wykonania
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
P-176322
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
P-176323
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
P-176324
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.
P-176327
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
P-176328
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.
P-176329
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
P-176331
« 1 »
  Strona 1 z 1