Zum Inhalt springen

[C] Datei-Inhalt ausgeben ?


squidward

Empfohlene Beiträge

Nabend!

Warum gibt der folgende Code nicht den Buchstaben von der test.txt "C" aus?

TestCode:

#include <stdio.h>


int main (void)

{

FILE *datei; 


datei = fopen ("test.txt", "rt"); 


printf("%s", *datei);


if(*datei == NULL)

{

    printf("Looser!");


}


return 0;

}

Inhalt der "test.txt":

C

Wie gebe ich denn beispielsweiße mit der Fkt. printf() den Datei-Inhalt aus?

Meine vermutteten Fehler:

1) Bei der Zeile mit "printf("%s", *datei);" kann der Fehler bei der Formatanweißung "%s" liegen, weil ich davon ausgegangen bin das ohne die Formatanweißung der Buchstabe in der test.txt nicht gelesen werden kann. Aber falls "%s" Tatsaechtlich Falsch ist, was muesste dann stattdessen eingesetzt werden?

2) Falsch angelerntes bzw. interpretiertes Wissen wie bei Pointern

Meine vermutung:

Pointer zeigen (d.h. Pointer) den Inhalt einer deklarierten Variablen ohne sie zu Modifizieren.

Bsp.:

int *a, b;

b = 15;

/*Hier wird es (unten fettgedruckt) in die Adresse von a gespeichert und ggf. wird mit einem zusaetzlichen "*" beispielsweiße bei "printf()" auf den Inhalt bzw. auf die 15 zugegriffen (vermutung).*/

a = &b; /*Meine Eselsbruecke bzw. Merkhilfe: Zeige mir dein Inhalt, Variable b (ohne den Operator "*" waere es: Zeige mir deine Adresse, Variable b. Das mit dem Operator "&" ist mir noch unklar, aber ich weiß nur dass ich das nur bei funktionen wie "scanf()" und eben in diesem Fall verwenden darf/muss.*/

MfG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du öffnest zwar eine Datei, liest aber nichts aus ihr ein.

Ein weiterer Fehler ist, dass Du versuchst den Zeiger "datei", der ein file handle ist, wie einen C-String auszugeben. Stattdessen musst Du zuerst Zeichen in einen buffer (z.B. in Form eines ein Arrays mit Elementen vom Typ char) einlesen (mit fread) und zusätzlich dafür Sorge tragen, dass der buffer ein Null-Byte nach allen eingelesenen Zeichen enthält, bevor Du ihn dann wie einen C-String ausgeben kannst.

Du solltest aber nur Zeichen einlesen, wenn das Öffnen der Datei erfolgreich war.

Zum Abschluss solltest Du die Datei mit fclose schließen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nabend!

Warum gibt der folgende Code nicht den Buchstaben von der test.txt "C" aus?

TestCode:

#include <stdio.h>


int main (void)

{

FILE *datei; 


datei = fopen ("test.txt", "rt"); 


printf("%s", *datei);


if([COLOR="Red"]*datei[/COLOR] == NULL)

{

    printf("Looser!");


}


return 0;

}

Was Derefenziertes auf NULL prüfen nicht sinnvoll...

Pointer zeigen (d.h. Pointer) den Inhalt einer deklarierten Variablen ohne sie zu Modifizieren.

Eben das machen Pointer nicht.

Bsp.:

int *a, b;

b = 15;

/*Hier wird es (unten fettgedruckt) in die Adresse von a gespeichert und ggf. wird mit einem zusaetzlichen "*" beispielsweiße bei "printf()" auf den Inhalt bzw. auf die 15 zugegriffen (vermutung).*/

a = &b; /*Meine Eselsbruecke bzw. Merkhilfe: Zeige mir dein Inhalt, Variable b (ohne den Operator "*" waere es: Zeige mir deine Adresse, Variable b. Das mit dem Operator "&" ist mir noch unklar, aber ich weiß nur dass ich das nur bei funktionen wie "scanf()" und eben in diesem Fall verwenden darf/muss.*/

a und b sind Zeiger.

(a = &b wäre in dem Fall: a zeigt auf die Adresse von Zeiger b.)

b = 15 wird nicht funktionieren, du willst ja den Inhalt ändern und nicht das, worauf b zeigt, also *b = 15;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nein, b ist hier ein int. Bedanke dich bei der seltsamen Deklarationssyntax.

Igitt.

Ok, dann ist b kein Zeiger. :floet:

Dann passt das auch.

a = &b; -> a zeigt auf b

b = 15 -> wenn b sich ändert und a auf b zeigt dann *a = 15

Wenn du in dem Fall a änderst (derefenzieren!) dann ändert sich b, da a auf b zeigt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du in dem Fall a änderst (derefenzieren!) dann ändert sich b, da a auf b zeigt.

Meinst du "*a" oder "a", denn wenn ich den Wert "a" aendere, kommt eine Fehlermeldung.

Aber wenn ich den Wert "*a" aendere, funktioniert alles einwandfrei.

Frage: Liegt es vermutlich daran, dass der Operator "*" auf den Inhalt von "a" oder "b" zugreift?

Edit:

Noch eine Frage: Was ist der Sinn und Zweck von Pointern?

Bearbeitet von squidward
Noch eine Frage!
Link zu diesem Kommentar
Auf anderen Seiten teilen

Meinst du "*a" oder "a", denn wenn ich den Wert "a" aendere, kommt eine Fehlermeldung.

Ich sagte ja derefenzieren (mit *).

Da du a auf die Adresse von b gesetzt hast, ist dies auch der Wert von a.

Angenommen b steht im speicher bei 0x1234567, dann zeigt a auf 0x1234567.

Da du aber den Wert ändern möchtest und nicht die Adresse, auf die a zeigt, musst du nicht die Referenz (Zeigerwert) von a ändern, sondern den Wert und dazu musst du eben derefenzieren.

Ergo:

a = 0x1234567

*(0x1234567) = 15 = Wert(0x1234567)

Noch eine Frage: Was ist der Sinn und Zweck von Pointern?

Mit Pointern kannst du viele schöne Sachen machen.

Ein Dozent sagte mal zu mir: "Pointer sind ein mächtiges Werkzeug".

Ein Grund dafür ist z.b. dass Call by Referenz in C nur mittels Pointer bewerkstelligt werden kann.

Ein anderer Grund ist, dass solche Sachen wie Arrays (Felder) im Endeffekt auch nur Zeiger auf den Speicher sind. Darunter gehören auch strings, welche ein char-Array repräsentieren.

Anmerkungen:

C Referenz -Zeiger-

Zeiger (Informatik ? Wikipedia)

[Edit]

Mal was zum Topic: http://home.fhtw-berlin.de/~junghans/cref/FUNCTIONS/fgets.html

Bearbeitet von TDM
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...