auslesen einer datei mit fscanf
-
hallo ich möchte den Inhalt einer txt datei auslesen. Hier der Quellcode:
void main()
{FILE *datei;
char text[100+1];
datei = fopen ("testdatei.txt", "r");
if (datei != NULL)
{
fscanf (datei, "%100c", text);
text[100] = '\0';
printf ("%s\n", text);
fclose (datei);
}
}
Beim ausühren bekomme ich nach der Ausgabe von "Hallo Welt!" allerdings eine große Anzahl von Symbolen auf der Konsole ausgegeben....
Mir ist klar, dass das die restlichen (undefinierten)Speicherplätze von dem char array sind, aber was kann ich es machen, dass dies nicht passiert?Vielen Dank für die hilfe
-
du setzt die 0 ans letzte element vom char array, und da es nicht intialisietrt wurde ist der inhalt undefiniert. Das dürfte helfen:
char text[100]={0}
-
yep, hat geholfen!
vielen Dank!
-
Ich verstehe die Antwort nicht.
Was bedeutet:player4245 schrieb:
du setzt die 0 ans letzte element vom char array, und da es nicht intialisietrt wurde ist der inhalt undefiniert.
Warum ist das mit geschweiften Klammern anders? Warum ist '\0' nicht initialisiert?
Ich hatte mich auch vorher schon gewundert warum man Arrays z.B.const char hallo[] = { "Hallo Welt\n" };
halt eben mit {} initialisiert.
-
ganz einfach: du hast ein array mit 100 elementen, das heisst der compiler reserviert 100 chars speicherplatz. da an dieser stelle im arbeitsspeicher aber schon vorher daten standen, und das array nicht intialisiert wird, muss man dies selbst tun. Das mit den Klammern hängt davon ab, dass C es erlaubt ein array so zu intialisieren, dass man den inhalt der elemente in diesen klammern angeben kann:
int z[3]={1, 2, 3}; // z[0]==1 z[1]==2 z[2]==3
in diesem fall übergibst du nur eine zahl, die der compiler in alle elemente einsetzt
-
Ah jetzt verstehe ich:
dein initialisieren mit null wird bei der Arrayerstellung gemacht. Ich dachte damit wolltest du auch das 100. (d.h. 101.) Element als nullbyte setzen so wie mythtranor das mittext [100] = '\0';
machen will.
Aber was geschieht beim initialisieren denn dann wirklich?
Setzt der COmpiler dann wirklich JEDEN Index null?
-
ja das ist halt so. da kannste auch fragen warum macht man mit == einen vergleich und ned mit =====
-
Balu Jr. schrieb:
Aber was geschieht beim initialisieren denn dann wirklich?
Der Compiler sieht:
int test [3] = {0};
und denkt sich: Ahaaaa, jetzt muss ich ein Integerfeld mit 3 Elementen auf 0 setzen.
Balu Jr. schrieb:
Setzt der COmpiler dann wirklich JEDEN Index null?
Jah! Wenn du das nicht glaubst, lass dir den Inhalt einmal mit und einmal ohne Initialisierung anzeigen.
-
Besten Dank an alle Schreiberlinge!
Jetzt bin ich wieder ein bisschen weniger dumm!