Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[C] Datei-Inhalt ausgeben ?

Empfohlene Antworten

Veröffentlicht

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

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.

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;

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.

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!

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.