squidward Geschrieben 6. Dezember 2008 Teilen Geschrieben 6. Dezember 2008 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Bubble Geschrieben 6. Dezember 2008 Teilen Geschrieben 6. Dezember 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 8. Dezember 2008 Teilen Geschrieben 8. Dezember 2008 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; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. Dezember 2008 Teilen Geschrieben 8. Dezember 2008 a und b sind Zeiger.Nein, b ist hier ein int. Bedanke dich bei der seltsamen Deklarationssyntax. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 8. Dezember 2008 Teilen Geschrieben 8. Dezember 2008 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
squidward Geschrieben 8. Dezember 2008 Autor Teilen Geschrieben 8. Dezember 2008 (bearbeitet) 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 8. Dezember 2008 von squidward Noch eine Frage! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 9. Dezember 2008 Teilen Geschrieben 9. Dezember 2008 (bearbeitet) 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 9. Dezember 2008 von TDM Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.