1. fopen() ist C Code und nicht C++ Code. Die C++-Variante würde ifstream heißen. (Dies ist die Klasse von der man Objekte zum Einladen von Dateien bildet).
2. fopen() öffnet nur die Datei und stellt einen Pointer zu dieser Datei her. Damit ist noch kein Inhalt eingelesen worden. Dafür gibt es Funktionen wie fread().
3. Hexadezimalwerte sind in C/C++ (meist) Speicherstellen. Wenn du so etwas angezeigt bekommst, ist das die Speicherstelle einer Variablen oder sonst eines Objekts im Speicher. Dann hast du wohl einen Pointer anstelle dessen "gepointeten" Wert ausgeben lassen.
In deinem Fall aber gibst du einen Pointer auf ein Dateiobjekt aus, was überhaupt keinen Sinn (oder zumindest nicht den von dir gewünschten) hat. Du brauchst da noch einen Speicherbereich in den eingelesen wird und musst dann mittels fread() dort Daten aus dem Dateiobjekt "datei" einlesen.
Ich würde dir aber dennoch die C++ Methode empfehlen, denn diese ist einfacher und auch zeitgemäßer, wenn du sowieso C++ programmieren willst.
Diese findest du im header "fstream", Klasse hab ich gesagt, ist die ifstream und ofstream (dann gibts afaik auch noch nur fstream und sicher ein paar Abwandelungen, brauchte ich bisher nicht...).
Ein Beispiel für das Einlesen einer Datei in C++ :
(Im gleichen Verzeichnis wie der Sourcecode muss eine "Datei.txt" Datei mit beliebigem Inhalt vorhanden sein (mindestens 11 Zeichen)).
Die simple Methode ist die erste, dabei werden per Stream-Operatur "<<" aus dem geöffneten "Dateistrom" so viele Byte entnommen, wie in die Variable rechts davon passen. Hier ein Byte, da es eine char Variable ist. Diese Variable nimmt dann den Inhalt an. Sehr mühsam wenn man große Datenmengen auslesen will.
(Ob man auch Speicherbereiche so angeben kann weiß ich nicht. Jedenfalls ist diese Methode zwar simpel aber Methode 2 würde ich empfehlen).
Die Methode 2 ließt so viele Byte ein, wie im letzten Parameter angegeben. Vorher muss aber ein Bereich mittels malloc() im Speicher reserviert werden, wo die Daten rein kommen. Wichtig ist hier, dass jeder String mit einem 0-Zeichen (Null) abschließen sollte da es sonst Fehler geben kann und wird. Deshalb musst du ein Byte mehr reservieren als du einlesen willst. Das letzte Zeichen muss 0 sein. Damit ich nicht rumfischen muss im letzten Byte, setze ich vor dem Einlesen per memset() alle Zeichen erst einmal auf 0. Jetzt werden 9 Zeichen in die 10 vorhandenen Stellen eingelesen, die letzte bleibt 0.
Beim Ausgeben von Speicherstellen kann man über Cout auch einfach den char-Pointer angeben, cout nimmt dann automatisch den Wert an der Speicherstelle, also den String, und gibt nicht die Speicherstelle selbst aus (Das Hexadezimale Zeugs von oben etwa).
Ich finde malloc aber viel schöner.
(Gibt auch noch calloc, warum auch immer...)
Dieses new hat für mich nix. Das ist mir zu array-lastig mit den Eckigen Klammern. Ich nutze seltener Arrays seitdem ich den Speicher so mit malloc leicht bereitstellen kann. Früher hab ich da mehr mit Arrays gemacht.
Was Freigabe betrifft, das übernimmt in der Regel das OS. Ok, man sollte es beispielhafterweise selbst übernehmen, wirklich schädlich ist es aber nicht.
Man kann auch einen Garbage Collector verwenden - ich finde, daß einer der besten Wege, zu verhindern, daß der Programmierer vergißt, Speicher freizugeben, ist, daß man ihm diese Arbeit abnimmt. (Whee, Kommainferno!) Wenn man nicht gerade ultimative Performanz benötigt stellt ein GC sicher eine brauchbare Alternative zur expliziten Speicherreservierung dar.
Ein Beispiel für einen C/C++-GC wäre libgc, das unter einer sehr toleranten Lizenz vertrieben wird.
BTW, kann man mit new mehrdimensionale Arrays reservieren? Ich kenne das nur mit malloc().
Ich erstelle immer eindimensionale und projeziere sie auf 2 Dimensionen. Das resultiert daraus, dass ich es einfach nicht vernünftig hinbekommen habe, ein zweidimensionales Array dynamisch größer oder kleiner zu machen.
Was Freigabe betrifft, das übernimmt in der Regel das OS. Ok, man sollte es beispielhafterweise selbst übernehmen, wirklich schädlich ist es aber nicht.
...
Gut für "normale"-BS's mag das ja stimmen, aber: "Informatiker schliessen ja auch ihre Dateien selbst" und free ist z.B. auch sehr Praktisch wenn es sich nur um ein spartanisches BS auf dem Target handelt. z.B. auf einem µC (Ich weiss, damit werden wohl nicht so viele hier zu tun haben, ich wollte es aber nur kurz anschneiden).
Da dann unter Umständen niemand den Speicher wieder freigibt nachdem er einmal vergeben ist.
Andererseits verkompliziert es den Antwort-Code für den Fragenden, und hilft somit vielleicht nicht immer wirklich weiter.
--
Ein Optimist ist in der Regel der Zeitgenosse, der am ungenügendsten informiert ist.
(John Priestley, engl. Schriftst. 1894 - 1984) News zu Star Trek gefällig?
BTW, es gibt sogar Gelegenheiten, wo es explizit erwünscht ist, daß Speicher nicht freigegeben wird.
Für Linux gibt es ein Kernelmodul, das es erlaubt, Linux auf fehlerhaftem RAM zu betreiben. Man ermittelt mit Memtest86 die Position der defekten Speicherzellen und übergibt sie dem Kernelmodul. Das Modul belegt dann die entsprechenden Speicherbereiche und gibt sie nicht mehr frei. Damit hat das System zwar weniger Speicher zur Verfügung, läuft aber stabil.
das OS gibt idR nicht automatisch von einem Programm alloziierten aber nicht freigegebenen Speicher frei, da Programmen ja auch erlaubt wird, ueber gemeinsame Speicherbereiche Daten auszutauschen. Demzufolge bleiben idR die Speicherlecks erhalten, bis ein Neustart des Rechners erflogt.
Die gaengige Programmierpraxis ist demzufolge, JEDES ?alloc hat ein free, JEDES new hat ein delete. Alles andere ist beschissener Programmierstil (ausser in den seltenen Faellen, die Jeez ansprach) und wird einen bei groesseren Projekten in Teufels Kueche bringen. Gerade Anfaenger sollten deshalb aufs schaerfste zur akribischen Einhaltung gezuechtigt werden, lesbarkeit hin oder her. Auf Fehlerfangen mit Exceptions kann man in Beispielcode mMn verzichten, aber eine korrekte Speicherverwaltung ist ein absolutes MUSS.
Ich bekenne mich ja schuldig.
Ich vergess ja leider selbst zu gern immer mal wieder den allocierten Speicher wieder freizugeben. In der letzten Zeit hab ich extra darauf geachtet, dass ich, wenn ich Speicher mehrfach reserviere, den vorherigen erst wieder freigebe, aber ob das konsequent im ganzen Programm so ist weiß ich nicht. Am besten mal mit der Suchfunktion nach malloc suchen (new hab ich im Programm bisher noch nicht verwendet) und überall checken, ob der Speicher auch wieder freigegeben wird.