Vergiss die ganzen C Dateioperationen. Wenn du mit Klassen arbeiten willst (oder auch ganz allgemein), nimm die C++ Dateistreams. Die haben dann schönerweise schon passende Operatoren für gängige Klassen wie std::string überladen. Und falls du nicht weißt, wonach du suchen sollst, gebe ich noch ein paar Stichwörter: fstream, ifstream, ofstream.
Außerdem: Ein Array von strings? Ich glaube nicht, dass du das willst.
Zuletzt bearbeitet von SeppJ am 15:54:31 20.10.2009, insgesamt 1-mal bearbeitet
Deine Operationen werden schon durchgeführt, jedoch:
1) while(!f.eof()) ist keine sehr gute Möglichkeit auf ein Dateiende zu prüfen.
2) Du musst beachten, wo der Lesepointer und der Schreibpointer hinzeigen. Diese zeigen an die Position, wo die nächste Lese-/Schreiboperation durchgeführt werden soll.
3) Wenn eine Lese- oder Schreibaktion schiefgeht (z.B. weil du dein getline auf eine leere Datei anwendest) wird daraufhin das failbit gesetzt. Dieses verhindert vorerst weiteres Lesen und Schreiben, bis die Situation geklärt wurde.
Deine Probleme sind auf ein Zusammenwirken dieser drei Punkte zurückzuführen. Ich kann dir später mal ein Beispiel zeigen, wie man das richtig machen kann, jedoch will ich zuerst mal wissen: Was soll das überhaupt werden? Reine Übung?
Da hast du dir aber eine Menge vorgenommen, für 24 h C++. In der Praxis hat man es fast nur mit streams zu tun, die rein lesend oder rein schreibend verwendet werden. Beides gleichzeitig verkompliziert die Sache nur. Ich selber habe gerade festgestellt, dass der Schreib- und Lesezeiger offenbar identisch sind, im Gegensatz zu dem, was ich bisher angenommen habe. Ich hab's nur noch nie gemerkt, weil ich es noch nie benutzt habe.
trotzdem ist hier eine kleine Demo der Sachen, die du in deinem Programm ausprobiert hast. Zusätzlich habe ich auch mal binäres Lesen demonstriert, weil fast alle Anfänger nach kurzer Zeit hier im Forum danach fragen:
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
fstream file;
file.open("abc.txt", ios::in | ios::out | ios::trunc); // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.
// Der Lese-/Schreibpointer zeigt jetzt auf den Anfang
// Schreibe ein bisschen was in die Datei
file << "Hello World!" << endl;
// Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
cout << file.tellp()<<endl; // 13
// Der Lese und der Schreibpointer sind nicht unabhängig voneinander:
cout << file.tellg()<<endl; // 13
// Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:
file.seekg(0);
string foo;
getline(file,foo);
// Gebe das Ergebnis aus:
cout << foo << endl; // Hello World!
// Schließe die Datei
file.close();
// Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
// Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)
file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen
char bar;
while(file.get(bar)) // Solange noch Daten vorliegen
{
cout << bar; // gebe diese aus
// Gibt "Hello World!" aus, inklusive abschließendem newline
}
} // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
fstream file;
file.open("abc.txt", ios::in | ios::out | ios::trunc); // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.
// Der Lese-/Schreibpointer zeigt jetzt auf den Anfang
// Schreibe ein bisschen was in die Datei
file << "Hello World!" << endl;
// Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
cout << file.tellp()<<endl; // 13
// Der Lese und der Schreibpointer sind nicht unabhängig voneinander:
cout << file.tellg()<<endl; // 13
// Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:
file.seekg(0);
string foo;
getline(file,foo);
// Gebe das Ergebnis aus:
cout << foo << endl; // Hello World!
// Schließe die Datei
file.close();
// Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
// Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)
file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen
char bar;
while(file.get(bar)) // Solange noch Daten vorliegen
{
cout << bar; // gebe diese aus
// Gibt "Hello World!" aus, inklusive abschließendem newline
}
} // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
fstream file;
file.open("abc.txt", ios::in | ios::out | ios::trunc); // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.
// Der Lese-/Schreibpointer zeigt jetzt auf den Anfang
// Schreibe ein bisschen was in die Datei
file << "Hello World!" << endl;
// Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
cout << file.tellp()<<endl; // 13
// Der Lese und der Schreibpointer sind nicht unabhängig voneinander:
cout << file.tellg()<<endl; // 13
// Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:
file.seekg(0);
string foo;
getline(file,foo);
// Gebe das Ergebnis aus:
cout << foo << endl; // Hello World!
// Schließe die Datei
file.close();
// Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
// Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)
file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen
char bar;
while(file.get(bar)) // Solange noch Daten vorliegen
{
cout << bar; // gebe diese aus
// Gibt "Hello World!" aus, inklusive abschließendem newline
}
} // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.