Lesen / Öffnen einer Datei schlägt fehl?
-
Hallo,
Ich habe derzeit ein ziemlich simples problem. Nun gut zu erst einmal meine Klasse:
Config.h
#include <fstream> #include <iostream> class ConfigReader { public: char* host; char* db; char* user; char* pw; ConfigReader(char* file); ~ConfigReader(); };
Config.cpp
#include "Config.h" ConfigReader::ConfigReader(char* file) { std::ifstream fs; fs.open(file); if, fs.is_open()) { try { fs >> host; fs >> db; fs >> user; fs >> pw; } catch (...) { throw "Cannot read Config File ..\n"; } } else { throw "Cannot open Config File .. \n"; } } ConfigReader::~ConfigReader() { delete[] host; delete[] db; delete[] user; delete[] pw; }
So nun zu meinem problem, ich komme jedes mal zur Cannot open Config File .. Exception. Lass ich das if weg bekomme ich eine Zugriffs problem.
Wie kann ich dies beheben. Die Datei exestiert auf jedenfall, und beinhaltet auch den kram den ich lesen möchte.
MFG René | chea77er
-
#include <iostream>
Wozu
<iostream>
? Benutze keine unnötigen Header.char* host; char* db; char* user; char* pw;
Was spricht gegen
std::string
? Du hast damit alle Probleme nicht (z.B. dass dein Programm nicht vorhersagbare Dinge tut, wenn du einConfigReader
-Objekt kopierst).ConfigReader(char* file);
Nimm besser
const char*
, den Dateinamen änderst du ja nicht.~ConfigReader();
Destruktor brauchst du mit
std::string
nicht mehr.std::ifstream fs; fs.open(file);
Geht direkt mit dem Konstruktor:
std::ifstream fs(file);
fs >> host; fs >> db; fs >> user; fs >> pw;
Du kannst doch nicht in Speicher schreiben, den du gar nicht angefordert hast. Wieder ein Problem, das mit
std::string
nicht existieren würde.catch (...) { throw "Cannot read Config File ..\n"; }
Der Code wird niemals ausgeführt, da
std::ifstream
standardmässig keine Exceptions wirft. Du müsstest schonexceptions()
aufrufen, hier fände ich aber eine simple Prüfung der Stream-Flags sinnvoller.chea77er schrieb:
Wie kann ich dies beheben. Die Datei exestiert auf jedenfall, und beinhaltet auch den kram den ich lesen möchte.
Hast du schon den
file
-String zur Laufzeit untersucht? Stimmt der Pfad wirklich? Hast du genügend Rechte, und die Datei ist nicht bereits von einem anderen Prozess geöffnet?
-
Hallo,
das sieht abgesehen von dem Tippfehler nicht dumm aus. Zeig doch mal den Code, an dem Dein Objekt erzeugt wird.
mfg Martin
-
Hallo René,
Du solltest die char* in Deiner Klasse gegen std::string austauschen. Die Exception kann nicht vom Lesen selbst kommen. Der Verdacht liegt nahe, dass Du im Konstruktor von ConfigReader zu wenig Speicher für die Strings allokierts.
Weitere Vorteil: der Destruktor wird überflüssig.Gruß
Werner
-
Ich benutzte auch lieber std::string jedoch Connecte ich mit dieses Configs zu einer Datenbank (libmysql). Und diese nimmt nur char* bzw const char* an. So abgesehen davon wie lese ich dies in einen std::string um.
fs >> host; (host ist nun ein std::string)
Dies funktioniert jedoch nicht. Ich möchte nur Zeile für Zeile lesen.Achja und vom lesen kann die Exception nicht kommen da es ja nicht mal zum lesen kommt da is_open() false übergibt.
-
chea77er schrieb:
Ich benutzte auch lieber std::string jedoch Connecte ich mit dieses Configs zu einer Datenbank (libmysql). Und diese nimmt nur char* bzw const char* an. So abgesehen davon wie lese ich dies in einen std::string um.
hast du deine Eingabe in einem std::string gespeichert, so kannst du über die Funktion c_str() diesen ja in ein char* umwandeln.
chea77er schrieb:
fs >> host; (host ist nun ein std::string)
Dies funktioniert jedoch nicht. Ich möchte nur Zeile für Zeile lesen.versteh ich nicht
//entweder std::string host; cin >> host; // oder wenn du Leerzeichen irgendwo drin hast geht auch getline getline(cin, host);
Zu deinem Dateiproblem kann man net viel sagen. Wurde ja schon drüber gesprochen. Wie instanziierst du denn dein Objekt.
- Befindet sich die Datei auch an dem angegebenen Pfad oder zumindest im gleichen Verzeichnis.
- Hast du Rechte drauf.
- Und kannst du ausschließen, dass die Iluminaten ihre Finger im Spiel haben?std::ifstream fs; fs.open("test.txt"); if(fs.is_open()) { cout << ":)" << endl; fs.close(); } else { cout << ":(" << endl; }
Bei mir gehts.
-
Probiers mal mit if (fs.good())
-
Hallo BasicMan01:
Grade mal deinen Code getestet, und bekomme leider nur raus ^^
Zum testen auch nochmal direkt in den main ordner, jedoch funktioniert es einfach nicht.
-
Wäre es fatal zu fragen, ob du die test.txt auch angelegt hast?
-
hm -.-
Das ist jetzt irgentwie peinlich. Hatte die Datei zwar angelegt jedoch wen ich über Start Debug in Vs2010 starte kann er die Datei nicht finden, starte ich direkt die .exe, dann funktioniert es. Ist das normal?
Ich dachte immer VS compiliert das Programm nach zB Debug und dort startet er die .exe dies scheint jedoch nicht der fall zu sein.
Weiß einer wo er diese direkt startet?
-
Das Standardarbeitsverzeichnis für die gestartete Anwendung ist das Verzeichnis der Projektdatei. Kann man ändern in den Projekteigenschaften unter Debugging.