Hi,
ich habe hier einen kleinen code schnipsel, denn ich nicht ganz
verstehe. Ich hoffe ihr könnt mir da weiter helfen. Die Prog.-sprache
ist C++ mit VS.
Es geht darum eine Datei zu öffnen. Dazu gibt es in einer Klasse eine
Funktion (OpenFile(string filename)).
1
bla::OpenFile(stringfilename)
2
{
3
std::ifstreamin(filename.c_str());
4
in>>(*this);
5
}
Ich habe also ein input file stream "in". filename.c_str() gibt einen
Zeiger auf den Inhalt der Datei zurück und in zeigt dann auf diesen
Inhalt? Ist das richtig?
Was genau bewirkt dann die Zeile "in >> (*this);"
Bitte um möglichst ausführliche Beschreibung.
Gruß
matzunami
matzunami schrieb:> Es geht darum eine Datei zu öffnen. Dazu gibt es in einer Klasse eine> Funktion (OpenFile(string filename)).> bla::OpenFile(string filename)> {> std::ifstream in( filename.c_str() );> in >> (*this);> }>> Ich habe also ein input file stream "in". filename.c_str() gibt einen> Zeiger auf den Inhalt der Datei zurück und in zeigt dann auf diesen> Inhalt? Ist das richtig?
Nein. filename.c_str() gibt einen Zeiger auf den Dateinamen als
C-String zurück, also einen Zeiger auf const char, denn in dem Format
möchte std::ifstream den Dateinamen haben. in "zeigt" danach auf gar
nichts, denn es ist kein Zeiger, sondern ein Stream-Objekt, in dem die
Datei geöffnet ist. Bis dahin wurde aus der Datei noch nichts gelesen.
> Was genau bewirkt dann die Zeile "in >> (*this);"
Das ist der Teil, der dann aus der Datei liest. Es ruft
operator>>(std::istream&, blah&) oder was ähnliches auf, um aus der
Datei Daten in das Objekt zu laden.
matzunami schrieb:> Ich habe also ein input file stream "in". filename.c_str() gibt einen> Zeiger auf den Inhalt der Datei zurück und in zeigt dann auf diesen> Inhalt? Ist das richtig?
Nein.
filename ist ein std::string mit dem Dateinamen.
Die Methode c_str() liefert zu einem solchen std::string einen
Zeiger auf das erste Zeichen eines C-kompatiblen (also
nullterminierten) Strings, aber immer noch mit dem Dateinamen
drin - nicht mit dem Inhalt der Datei.
matzunami schrieb:> Was genau bewirkt dann die Zeile "in >> (*this);"
in ist der Datei-stream, den du kurz vorher geöffnet hast,
steht also für die geöffnete Datei.
this ist in C++ in einer Methode immer ein Zeiger auf das
aktuelle Objekt, *this ist also das aktuelle Objekt der Klasse
bla (für das die Methode OpenFile() aufgerufen wird).
>> ist eigentlich der Operator zum Rechtsshiften.
Für Streams als ersten Oepranden wird dieser Operator häufig
dazu mißbraucht, ein Objekt einzulesen.
Es sollte also irgendwo in deinem Programm so etwas geben:
Das ist die Überladung des Shift-Operators >> für einen
ersten Operanden vom Typ std::ifstream (oder davon abgeleitet)
und einem zweiten Operanden vom Typ bla.
Mit
1
in>>(*this)
wird also genau diese Überladung aufgerufen, mit in als erstem
Parameter und dem aktuellen Objekt als zweitem.
Mehr dazu bei Stroustrup.
Ohne Buch wirst die in C++ nicht weit kommen...
Klaus Wachtler schrieb:> std::istream &operator>>( std::istream &s, const bla &einBla ).
und der Operator sollte kein "const bla" kriegen, schliesslich soll er
da ja Werte reinschreiben ;)
Klaus Wachtler schrieb:> hm, wieder schlechte Koordination.> Aber wenigstens widersprechen wir uns nicht :-)
Du hast es ja noch etwas ausführlicher und besser erklärt. Nur darüber
solltest du nochmal nachdenken:
Klaus Wachtler schrieb:> std::istream &operator>>( std::istream &s, const bla &einBla )...
ok, soweit so gut, schon mal vielen Dank.
also zeigt der this Zeiger dann auf den Inhalt meiner Datei. Und wenn
ich die Funktion verlasse, und irgend einen anderes Objekt meiner
Instanz aufrufe, dann zeigt der this Zeiger immer noch auf den Inhalt
meiner Datei, und ich könnte ihn zB. zum auslesen benutzen, ist das
richtig?
matzunami schrieb:> also zeigt der this Zeiger dann auf den Inhalt meiner Datei.
Nein. Nichts in dem Abschnitt oben zeigt auf den Inhalt der Datei. "in"
verweist zwar auf die Datei, aber nicht auf deren Inhalt.
matzunami schrieb:> ok, soweit so gut, schon mal vielen Dank.>> also zeigt der this Zeiger dann auf den Inhalt meiner Datei.
this zeigt auf das Objekt.
> Und wenn ich die Funktion verlasse, und irgend einen anderes Objekt> meiner Instanz aufrufe,
Was meinst du mit "ein anderes Objekt meiner Instanz"? Ein Objekt ist
eine Instanz.
> dann zeigt der this Zeiger immer noch auf den Inhalt meiner Datei, und> ich könnte ihn zB. zum auslesen benutzen, ist das richtig?
Der this-Zeiger hat mit irgendwelchen Dateien überhaupt nichts zu tun.
Er zeigt einfach nur auf das aktuelle Objekt, sonst nichts.
Die Datei wird durch den ifstream repräsentiert.
ich bin verwirrt :-)
dann mal so. Ich habe meine main und die Klasse nenn ich mal Datei.
void main ()
{
char bla;
Datei datei;
// jetzt öffne? ich die datei
datei.OpenFile(<dateiname>);
//jetzt möchte ich was aus der datei lesen
bla = datei.ReadFile();
cout << bla;
}
wie muss ReadFile aussehen um von der Datei etwas lesen zu können?
Datei::ReadFile()
{
???
return (erstes Zeichen aus Datei)
}
Das steht doch in jedem C++-Buch.
Soll ich dir Seiten im Stroustrup nennen, oder gleich vorlesen?
So ein Forum ist doch kein Kindergarten für Leute, die nicht
lesen wollen, aber trotzdem Hausaufgaben abgeben müssen.
Die Grundlagen musst du selber lernen, bitte.
matzunami schrieb:> ich bin verwirrt :-)>> dann mal so. Ich habe meine main und die Klasse nenn ich mal Datei.>> void main ()
main() muß int zurückliefern.
> {> char bla;> Datei datei;>> // jetzt öffne? ich die datei> datei.OpenFile(<dateiname>);>> //jetzt möchte ich was aus der datei lesen
Das hast du doch schon, innerhalb von OpenFile. Zitat von oben:
Rolf Magnus schrieb:>> Was genau bewirkt dann die Zeile "in >> (*this);">> Das ist der Teil, der dann aus der Datei liest.
Bei Rückkehr aus der Funktion wird die Datei dann wieder geschlossen.
Ich muß Klaus hier Recht geben. Lies in einem Buch (am besten
Stroustrup) nach, wie C++ funktioniert. Dein Verständnis von C++ liegt
zu weit weg von der Realität, daß man das mit ein paar Forumsbeiträgen
nicht erklärt bekommt.
matzunami schrieb:> wie muss ReadFile aussehen um von der Datei etwas lesen zu können?
Das hängt jetzt wiederrum von den Details der Klasse Datei ab.
Innerhalb dieser Klasse wirst du ein Stream Objekt haben.
Wenn die Funktion OpenFile aufgerufen wird, dann bekommt das Stream
Objekt den Auftrag die Datei zu öffnen.
Damit ist erst mal der Kanal zu den Daten geöffnet worden
> Datei::ReadFile()> {> ???> return (erstes Zeichen aus Datei)> }
Und wie diese Funktion konkret aussieht, hängt wiederrum davon ab, was
in der Datei wie abgespeichert wurde.
Eines aber ist sicher: Sie wird sich irgendwelcher Operationen bedienen,
die aus dem Stream Objekt (welches ein Member der Klasse ist) die Daten
lesen.
Dazu gibt es mehrere Möglichkeiten, und eine davon ist die Verwendung
des überladenen >> Operators.
Mir gehst wie den anderen. Ich verstehe nicht, was da jetzt daran so
schwer zu verstehen ist.
Da ist ein Stream Objekt
Und es gibt zb die << und >> Operatoren, die auf/von diesem Stream
schreiben/lesen.
Was anderes machst du doch auch nicht bei
std::cout << "Hallo world\n";
oder
int i;
std::cin >> i;
cin bzw. cout sind Stream Objekte. Und die überladenen << bzw >>
Operatoren erledigen das Schreiben/Lesen. Nur das halt hier die Streams
mit der Konsole verbunden sind und jetzt enden sie halt auf einmal in
einem File. Aber ansonsten ist doch alles gleich.
Ok vielen dank, ich werd mich eventuell noch etwas einlesen. Ich habe
hier nur momentan nix und der code ist auch nicht von mir, ich wollt ihn
nur verstehen. Es gibt halt auch noch eine Funktion read, aber die
versteh ich nicht. Damit will ich euch aber auch nicht weiter
langweilen. In erster linie will ich die Klasse verwenden, und musste
sie dazu um eine Methode erweitern. Das Funktioniert erst mal.
Aber ihr habt mir trotzdem sehr weitergeholfen.
Danke