c++ otwieranie pliku - nie działa

0

Witam. Sposobów na sprawdzenie istnienie pliku już użyłem wiele - bez skutku. Zapytałem naszego wuja, ale jego sposoby też nie reagują odpowiednio, przybliżę. Mój i wujka kod sprawdza tak, że plik istnieje, a raz nie. Kiedy mu się tylko spodoba. Niekiedy potrafi stwierdzić, iż plik istnieje zawsze, lecz w rzeczywistości go nie ma. Pomocy, te funkcje są chyba zbugowane, albo ja sam jestem zbugowany ; (

Kodzik tradycyjnie:

class MyFile
{
    public:
		bool Exists(char filename[])
		{
		        fstream f;
			f.open(filename);
			if(f.good() == true)
			{
				return true;
			}
			return false;
		}
};
 
0

I co związku z tym? Program i tak sprawdza jak mu się tylko żywnie podoba, próbowałem z is_open, fail, good, z bool'em wartością true i bez pozytywnego skutku :/

0

Brise mini spray. Już minęło trochę czasu, a tu nic :( No więc ludziska, co z tym fantem zrobić?

0

wywolaj open tylko z mode fstream::in
a pozniej sprawdz czy zostal plik poprawnie otwarty przy uzyciu is_open
i do cholery!!! zamknij za pomoca close() ten strumien przed wyjsciem z tej metody
poza tym Exists powinno miec naglowek: bool Exists(const char* filename)

a to: char filename[] - to jakas masakra!

0

@massther trochę FAIL. Tak się składa, że strumieni nie trzeba zamykać ręcznie bo destruktor się tym zajmuje <wall>. A co jest złego w char filename[]? Ogólnie kod powinien wyglądać tak

bool Exists(char filename[]) {
  fstream f;
  f.open(filename, ios::in);
  return f.good();
}

A nawet jeszcze krócej:

bool Exists(char filename[]) {
  return fstream(filename, ios::in).good();
}

A jeszcze lepiej było by użyć funkcji systemowych.

0

Dlaczego uważasz, że tablica charów to masakra? Const przyznam ci rację, bo tylko raz zmieniam wartość. Lecz to co mówisz nie dało zbytniego efektu. Program uważa, że istnieją pliki m.in o takich nazwach: "1" , "asf" , "pf". Nie wiem jaki to ma związek z istnieniem pliku, gdyż te nazwy wcześniej przypadkowo wpisywałem do consoli. Czyżby rejestry, pliki tymczasowe, ale jakim cudem?

Kod według Ciebie:

<code = cpp>
bool Exists(const char *filename)
{
fstream f;
f.open(filename,fstream::in);
if(f.is_open() == true)
{
return true;
}
return false;
f.close();
}

0

Przecież to close się nigdy nie wykona.

0

To i tak nic nie zmieni. Próbowałem z systemowym fopen i taki sam efekt co z fstream :/

0

a to: char filename[] - to jakas masakra!
Masakrą to jest wskaźnik. Tablica powinna być tablicą, a wskaźnik wskaźnikiem. Nagminne mieszanie tego skutkuje potem stwierdzeniami że „tablica to tak naprawdę wskaźnik”. Samo dopuszczenie niejawnej konwersji między jednym a drugim to jedno z większych projektowych WTF języka.

0

Co więc z moim problemem? Wszystko przygotowałem, zrobiłem sobie 'mini-engine' - w tym metody, a jedynie na drodze stoi mi ten problem. Chciałbym ten projekt ukończyć i zabrać się za coś bardziej trudniejszego.

0

Przecie Ci podałem dwa rozwiązania.

0

Tak, ale ja przypominam Ci, że twoje przykłady wypierają tę samą czynność co pierwszy kod jaki wstawiłem w tym temacie.

0

Mi kod:

#include <iostream>
#include <fstream>

using namespace std;

bool exists(const char filename[]) {
  return fstream(filename, ios::in).good();
}

int main() {
	if(exists("pierd.txt"))
		cout << "pierd.txt istnieje\n";
	if(exists("null.txt"))
		cout << "null.txt istnieje\n";
}

działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1