Forum: PC-Programmierung this pointer


von matzunami (Gast)


Lesenswert?

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(string filename)
2
{
3
  std::ifstream in( 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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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:
1
std::istream &operator>>( std::istream &s, const bla &einBla )...
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...

von Klaus W. (mfgkw)


Lesenswert?

hm, wieder schlechte Koordination.
Aber wenigstens widersprechen wir uns nicht :-)

von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> ersten Operanden vom Typ std::ifstream (oder davon abgeleitet)
std::istream natürlich

von Schorsch (Gast)


Lesenswert?

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 ;)

von Klaus W. (mfgkw)


Lesenswert?

Stimmt, da war ich in Gedanken bei der Ausgabe.
Du hast vollkommen recht.

von Rolf M. (rmagnus)


Lesenswert?

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 )...

von matzunami (Gast)


Lesenswert?

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?

von Schorsch (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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)
}

von Schorsch (Gast)


Lesenswert?

Du löscht "in >> (*this);" aus der OpenFile und trägst es in die 
ReadFile ein.
Musst dann natürlich den "in" stream als Member durchschleifen.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Schorsch (Gast)


Lesenswert?

Was du aber eigentlich wolltest (einzelnen Buchstaben lesen) geht so:
1
int main() {
2
  char c;
3
  std::ifstream in( <filename> );  
4
  in >> c;
5
  std::cout << c;
6
}

Ganz ohne extra "Datei"-Klasse, denn die gibts ja vorgefertigt als 
"std::ifstream".

von Rolf M. (rmagnus)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von matzunami (Gast)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.