Dateihandling + Strings | Ein- und Auslesen
-
Hallo,
Ich finde meinen kleinen, Fehler nicht, der meinen Code zum Versagen bringt.
Ich glaube es sind 2.
1. Er liest nur das erste Wort des Strings ein
2. Er gibt selbst davon nur die ersten 3 Buchstaben aus :S/* * Autor: Marius Schuller * * Datum: 18.05.2007 * * Sprache: C * * Dateiname: uebung * * Beschreibung: Uebungen: Speichert eine Datei dessen Pfad+Namen der Benutzer * auswählt und anschließend Text hineinschreibt. Gibt diesen Text * dann aus. * */ #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *mein_text; char *string; char *string_t; char *tstring; string = calloc(50, sizeof(char)); string_t = calloc(250, sizeof(char)); tstring = calloc(250, sizeof(char)); printf("Geben Sie einen Dateinamen INKL. Pfad an: \n"); scanf("%s", string); mein_text = fopen(string, "w"); if(mein_text == NULL) { printf("An error occured while opening the file! (write)\n"); exit(1); } printf("Access to the file was successfull!\n"); printf("Geben Sie ihren Text ein: (max. 250 Zeichen)\n"); scanf("%s", string_t); fprintf(mein_text, "%s\n", string_t); fclose(mein_text); /*Daten wieder einlesen*/ memset(tstring, '\0', sizeof(string_t)+1); mein_text = fopen(string, "r"); if(mein_text == NULL) { printf("An error occured while opening the file! (read)\n"); exit(1); } fgets(tstring, sizeof(string_t), mein_text); printf("%s\n", tstring); fclose(mein_text); free(string); free(string_t); free(tstring); return(0); }
-
der fehler ist, dass du die funktion scanf verwendest, die nur bis zum ersten whitespacezeichen (tab, leer, ...) einliesst. du solltest fgets verwenden auch hier verwenden und als FILE* parameter dann stdin übergeben.
-
Der zweite Fehler ist, dass du sizeof auf Zeiger anwendest, nicht auf arrays. Wenn die Zeiger 4 Byte lang sind, dann ergibt der Ausdruck sizeof(foo*) halt auch nur 4. Nicht aber die Zahl der via calloc() reservierten Bytes zurück.
Weiteres:
- es wäre schon sinnvoll die Rückgaben von calloc() auf NULL zu testen
- sizeof(char) ergibt immer 1