[C][Visual Studio 2013]fgets liest String aus Datei nicht richtig ein



  • Hallo zusammen,

    ich habe folgendes Problem:

    Ich möchte aus einer TXT-Datei Wörter auslesen und in einem Char-Array abspeichern.
    Die Wörter sind durch Zeilenumbruch voneinander getrennt.
    Das Char-Array liegt auf dem Heap.

    Das Ganze funktioniert auch soweit wird auch alles erzeugt gibt keinen Compiler-Fehler und nichts, aber aus der Datei wird nur Datenmüll gelesen 😞

    Kann mir ehrlich gesagt keinen Reim drauß machen und für euch ist das sicher easy aber ich steh gerade total auf dem Schlauch! 😕

    #include <stdio.h>
    #include <stdlib.h>
    
    char *Read_File(char Dateiname[])
    {
    	FILE *fr;
    	int anzahl_zeichen = 0;
    	char *ptrliste = NULL;
    
    	if ((fr = fopen(Dateiname, "r")) == NULL)
    	{
    		printf("Datei %s konnte nicht geoeffnet werden!\n", Dateiname);
    	}
    	else
    	{
    	   while (fgetc(fr) != EOF)
    		{
    			anzahl_zeichen++;
    		}
    
    		ptrliste = malloc(anzahl_zeichen*sizeof(char));
    
    		fgets(ptrliste, anzahl_zeichen,fr);
    		printf("\nHier die Liste: \n");
    		fclose(fr);
    	}
    	return ptrliste;
    

    Betriebssystem: Windows 7 (64-bit)
    Programmierumgebung: Visual Studio 2013
    Programmiersprache: C

    Sollten noch Infos notwendig sein bitte melden.

    Dickes Danke schonmal für eure Hilfe!

    P.s: Bin natürlich auch sonst für Anregungen zum Code (ist nicht viel bis jetzt weiß ich) dankbar!

    Viele Grüße
    Christian


  • Mod

    Also erst liest du die gesamte Datei Zeichen für Zeichen aus und dann versuchst du am Ende der Datei noch einmal ein großes fgets. Wundert dich das wirklich, dass das nicht einliest?

    Weitere Dinge, die mir nicht gefallen:
    -Der Funktion wird ein Dateiname übergeben, dann versucht sie selber, die Datei so zu öffnen, wie sie es für richtig hält. Was, wenn andere Parameter gewünscht oder erforderlich sind? Oder die Datei schon anderswo offen ist? Das Öffnen einer Datei gehört nicht in eine Lesefunktion. Übergib der Lesefunktion die Datei selbst (also einen FILE*), nicht den Dateinamen.
    -Die gleiche Argumentation gilt auch für dynamische Speicherverwaltung. Das hat nichts in einer Lesefunktion zu suchen. Speicher zu besorgen und zu verwalten ist Sache des Anwenders.
    -In der Folge bleibt eigentlich gar nichts mehr übrig von deiner Funktion, nachdem du diese beiden Dinge entfernt hast. Dann hast du quasi nur einen Wrapper um fgets geschrieben und könntest genausogut direkt fgets benutzen.

    Weiterhin liest fgets nur bis zum nächsten Zeilenumbruch. Das passt nicht zu der Beschreibung dessen, was du erreichen möchtest. Klingt eher nach einem Fall für fread oder für eine Folge von fgetc.



  • Ach verdammt stimmt... Der Dateipositionszeiger im Puffer
    Ende der Datei ist halt Ende 😃
    Dankeschön!

    Ja mit der dynamischen Speicherverwaltung hast du absolut recht!
    Was den Fall Datei bereits geöffnet angeht, dass wird ja abgefangen.

    Was fgets angeht passt das soweit schon, da ich im Endeffekt Wort für Wort verarbeiten will

    Aber danke für deine Hinweise und Tipps 🙂
    Sind ja zwar erst erste Schritte und bisschen Rum probieren aber gerade da ist Feedback wichtig!

    Also nochmal vielen Dank für deine Zeit und Mühe! 👍



  • Chris25046 schrieb:

    Sind ja zwar erst erste Schritte und bisschen Rum probieren aber gerade da ist Feedback wichtig!

    Vorsicht mit dem Rum!



  • 😮

    Herum natürlich (Auto correct sei dank)
    Kein Alkohol bei der Arbeit! 😃


Log in to reply