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

question-closed fstream cpp obiektowe

Object Storage Arubacloud
0 głosów
348 wizyt
pytanie zadane 24 grudnia 2017 w C i C++ przez jveaster Początkujący (440 p.)
zamknięte 12 stycznia 2018 przez jveaster

Mam problem z fstream. Chcę sprawdzić czy plik txt istnieje, jeżeli nie - pokazać msgboxa z dwiema możliwościami. Pierwsza - wykonaj kilka czynności a następnie stwórz ten plik txt. Druga - zamknij aplikację.

Jeżeli plik istnieje, program ma wykonać kilka czynności.

Oczywiście coś nie działa, nwm co. Kod:

std::fstream plik;
plik.open("plik.txt", std::ios::in | std::ios::out | std::ios::app);
if (plik.good()==false)
{
    if(MessageBox(0, "pytanie", "naglowek", MB_YESNO) == IDYES)
    {
        ShellExecute(0,"open","instrukcja ktora wykonuje program",NULL,NULL,0);
        plik<<"jakis napis"<<std::endl;
        plik.close();
    }
    else {
    plik.close();
    MainForm->Close();
    }
}
else
{
        ShellExecute(0,"open","Czynnosc",NULL,NULL,0);
        plik.close();
}

Wymieni mi ktoś błędy które popełniłem?

komentarz zamknięcia: Problem już rozwiązany.
1
komentarz 24 grudnia 2017 przez Milesq Nałogowiec (32,020 p.)

jeśli otwierasz plik z ios::out plik jest tworzony więc metoda .good()

zawsze da true

poza tym może stwórz funkcję sprawdzającą czy plik istnieje?

będzie łatwiej

#include<fstream>
using namespace std;
bool fileExists(string name) {
fstream file;
file.open(name.c_str(), ios::in);
bool ret = file.good();
file.close();
return ret;
}

 

2
komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Nie odpowiadamy na pytania w sekcji komentarzy. Proszę o tym pamiętać na przyszłość.
komentarz 24 grudnia 2017 przez jveaster Początkujący (440 p.)

Coś mi ta funkcja nie działa, nawet po przystosowaniu kilku rzeczy do programu nadal coś jest nie tak.

bool fileExists(string nameV) {
std::fstream file;
file.open(nameV, std::ios::in);
bool ret = file.good();
file.close();
return ret;
}

To jest kod, errory:

E2147 'string' cannot start a parameter declaration     (bool fileExists(string nameV))

E2034 Cannot convert 'int' to 'const char *'                 (file.open(nameV, std::ios::in);)

E2342 Type mismatch in parameter '__s' (wanted 'const char *', got 'int') (jak wyżej)

Wiesz może co jest nie tak?

komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Spróbuj dodać std::string zamiast string.
komentarz 24 grudnia 2017 przez jveaster Początkujący (440 p.)
Zostają 2 pozostałe błędy
komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Dodaj także obsługę C++11 lub skorzystaj z metody c_str w stringu.
komentarz 24 grudnia 2017 przez Milesq Nałogowiec (32,020 p.)

myślę że łatwiej będzie Ci użyć na początku kodu using namespace std; niż potem wszędzie dodawać ten przedrostek

i może daj cały kod

 

komentarz 24 grudnia 2017 przez jveaster Początkujący (440 p.)
Bardziej mi się opłaca co chwilę pisać std::, kod jest bardzo długi.
komentarz 24 grudnia 2017 przez Milesq Nałogowiec (32,020 p.)
no więc po to jest using namespace

2 odpowiedzi

+1 głos
odpowiedź 24 grudnia 2017 przez JAKUBW Nałogowiec (33,470 p.)
wybrane 24 grudnia 2017 przez jveaster
 
Najlepsza

Jeżeli piszesz tylko pod Windowsa to warto użyć WinApi - będzie wydajniej. Ten kod powinien załatwić sprawę:

#include <windows.h>

BOOL FileExists(LPCTSTR path){
  DWORD dwAttrib = GetFileAttributes(szPath);

  return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
         !(dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
}

Przykład użycia:

string path = "plik.txt";

if(FileExists(path.c_str()))
;//Plik istnieje
else
;//Plik nie istnieje

 

komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Wątpię, aby różnica wydajnościowa była jakaś znacząca, a tracimy tak pożądany przecież interfejs dla wszystkich systemów operacyjnych.
komentarz 24 grudnia 2017 przez JAKUBW Nałogowiec (33,470 p.)
Owszem tracimy, ale otwieranie tylko po to aby go zamknąć i nie używać ma mały sens.

Zawsze można dodać alternatywną funkcje dla Linuxa. To nie jest problem.
komentarz 24 grudnia 2017 przez jveaster Początkujący (440 p.)
Działa, dzięki.
komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Przecież napisałem w swojej odpowiedzi metodę z powtórnym wywołaniem open. Czyż nie jest ona przez ciebie akceptowalna?
0 głosów
odpowiedź 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Obiekt std::fstream przy podanych ustawieniach tworzy plik, jeśli on nie istnieje. W celu sprawdzenia dostępności pliku użyj jedynie flagi std::ios::in. Potem możesz znowu otworzyć plik, ale z innymi flagami, za pomocą metody open.
komentarz 24 grudnia 2017 przez jveaster Początkujący (440 p.)
W komentarzu do poprzedniej odpowiedzi opisałem problem występujący przy takim rozwiązaniu.
komentarz 24 grudnia 2017 przez Patrycjerz Mędrzec (192,320 p.)
Ale tej od Milesqa? Przecież moje rozwiązanie wymaga jedynie zmiany flag w konstruktorze obiektu std::fstream oraz późniejszego otwarcia pliku kolejny raz, ale z flagami do zapisu.

Podobne pytania

0 głosów
1 odpowiedź 168 wizyt
pytanie zadane 23 maja 2020 w C i C++ przez Nabuchadonozor Gaduła (3,120 p.)
0 głosów
2 odpowiedzi 259 wizyt
pytanie zadane 6 października 2016 w C i C++ przez BezNazwy Użytkownik (540 p.)
0 głosów
1 odpowiedź 298 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...