Datei wird nicht erzeugt
-
Hallo,
dank des tollen Artikels auf der Main kenne ich jetzt die STL
und sie hat mir wirklich geholfen
Nun habe ich allerdings ein kleines Problemchen.
Ich habe eine Klassecommentgeschrieben, alle Member funktionieren toll nur einer nicht:void comment::create(void) { source.close(); strptr=new string; for (int i=0;i<lines;i++) { cout << filename.front() << endl; fstream fout(filename.front().c_str());//(1)//Da filename eine <string> queue ist muss noch der c_str modus aktiviert werden while (!fout.eof()) getline(fout, *strptr); //Das Ende der Datei erreichen //damit nicht schon vorhandene Kommis überschrieben werden fout << content.front() << " - "; cout << "Datei <" << filename.front() << "> enthaelt: " << content.front() << endl; content.pop(); filename.pop(); fout.close(); } delete strptr; }Die Queue
filenameenthält strings im folgenden Format:
[Laufwerksbuchstabe]:[Dateiname].txtDas Weglassen des Laufwerksbuchstabens, damit die Datei im Root-Verzeichnis angelegt wird, habe ich auch schon probiert - war nichts.
Dann habe ich, dort wo die Dateien entstehen sollten, Dateien mit dem Dateinamen, der in der Queue stehen würde, erstellt.
Nun wurde die Flag vonfoutnicht nullgesetzt, das heißt die Datei war offen. Ich wähnte mich als Gewinner, als die Funktion ihr Ass aus dem Ärmel zog:
Die Datei wurde nicht beschrieben
Könnt Ihr mir weiterhelfen?
EDIT: Als ich einen festen Pfad in Zeile 8 anstelle des Pfades aus der Queue eingefügt habe, hat es funktioniert. Obwohl der von Hand eingegebene Pfad genau derselbe war wie der aus der Queue.
-
Das sieht zu kompliziert aus! Auch ist nicht klar, was die übrigen Funktionen deiner Klasse tun.
- Für Dateinamen verwendet man besser nicht die String-Klasse string.
- Normale char-strings sind hier vorteilhafter.
- Die Datei-Funktionen sind zum Öffnen und Schliessen nur einmal notwendig.
- Innerhalb der while-Schleife wird nur noch gelesen.
- Auch für getline ist ein char-string übersichtlicher.
Warte auf die Bescherung. Vielleicht bringt der Weihnachtsmann die etwa 20 Zeilen Sourcecode vorbei.
-
knecht ruprecht schrieb:
- Für Dateinamen verwendet man besser nicht die String-Klasse string.
- Normale char-strings sind hier vorteilhafter.
- Auch für getline ist ein char-string übersichtlicher.Das musst du erklären.
-
knecht ruprecht schrieb:
Das sieht zu kompliziert aus! Auch ist nicht klar, was die übrigen Funktionen deiner Klasse tun.
Ist ja für diese Funktion auch irrelevant, sie ruft sie ja nicht auf.
Wären die 200 Zeilen Code lieber?
- Für Dateinamen verwendet man besser nicht die String-Klasse string.
- Normale char-strings sind hier vorteilhafter.Die Größe des benötigten Speichers ist unbekannt, insofern bin ich mit std::string viel besser dran, ich habe einen dynamischen Speicher, keine 'Magic Numbers'
mitstd::string.c_str()spare ich mir auch das Gefrickel mit den char-Arrays- Die Datei-Funktionen sind zum Öffnen und Schliessen nur einmal notwendig. - Innerhalb der while-Schleife wird nur noch gelesen. - Auch für getline ist ein char-string übersichtlicher.Das Öffnen ist durchaus mehrere Male notwendig, da immer eine neue Datei geöffnet wird, weil ja die Queue mit jedem Durchgang mit
.pop()verkürzt wird. Das Lesen in der while-Schleife ist eine (zugegebenermaßen unschöne) Lösung um an das Ende der Datei zu kommen, steht auch im Kommentar.Warte auf die Bescherung. Vielleicht bringt der Weihnachtsmann die etwa 20 Zeilen Sourcecode vorbei.
Toll, der Ratschlag bringt den Code jetzt zum Laufen :xmas1:
-
String-Klasse oder Frickelei mit char-Strings? Das ist eine Sache der Anschauung und der Erfahrung. Viele ältere Programmierer sind bei der Frickelei geblieben, weil sie damit im Schlaf umgehen können - ich auch. Das Problem des Fragestellers liegt aber wohl woanders, was hier nicht völlig klar geworden ist. Es bleibt aber dabei, eine Datei muss zum Schreiben und Lesen jeweils geöffnet und geschlossen werden. Wie man den Dateinamen bereitstellt, die Datei schreibt und liest ist und bleibt Aufgabe des Programmierers. Es stimmt, der Weihnachtsmann kann da wenig helfen!
-
fstream fout(filename.front().c_str()); while (!fout.eof()) getline(fout, *strptr); //Das Ende der Datei erreichen //damit nicht schon vorhandene Kommis überschrieben werdenSchau dir mal das an, vor allem openmode:
http://cplusplus.com/reference/iostream/ofstream/ofstream/
http://cplusplus.com/reference/iostream/ofstream/open/
Wird dir sicher gefallen
Außerdem würde ich strptr nicht auf dem Heap erstellen. Da reicht doch ein lokales (value)Objekt.
-
l'abra d'or schrieb:
fstream fout(filename.front().c_str()); while (!fout.eof()) getline(fout, *strptr); //Das Ende der Datei erreichen //damit nicht schon vorhandene Kommis überschrieben werdenSchau dir mal das an, vor allem openmode:
http://cplusplus.com/reference/iostream/ofstream/ofstream/
http://cplusplus.com/reference/iostream/ofstream/open/
Wird dir sicher gefallen
Ist ja herrlich, ich beginne diese Datenbank zu lieben

Weil ich nicht dahintergekommen bin, wie das Problem mit dem Dateierstellen zustande gekommen ist, schreibe ich das Programm gerade neu (mit einigen Verbesserungen^^)
Wenn ich es habe, melde ich mich wieder.Außerdem würde ich strptr nicht auf dem Heap erstellen. Da reicht doch ein lokales (value)Objekt.
Doofe Frage, warum?

Was ich dazusagen sollte,strptrist ein privater Member der Klasse. So wie ich ihn verwendet habe fungiert er an sich wie ein normaler string (man spricht ihn halt anders an). Oder ist das wieder unschön programmiert?
In den Büchern steht halt so verdammt wenig über unschöne Sachen drin
Ansonsten, vielen Dank für Eure Hilfe und einen guten Start ins Neue Jahr!
-
Da du den String ja nur innerhalb der Funktion verwendest, reicht es auch einfach
string str;als lokale Variable anzulegen.
Ein Klassenmember sollte sie nur sein, wenn du sie für mehrere Funktionen benötigst (und zwar bezogen auf den Inhalt - nicht wenn du in jeder Funktion einfach eine temporäre Variable benötigst!).Zeiger sollte man ebenfalls nur verwenden, wenn man sie auch wirklich benötigt (d.h. z.B. wenn auch ein Nullwert erlaubt sein soll oder aber die Konstruktion und Destruktion in zwei verschiedenen Funktionen stattfindet).