.txt Datei einlesen und in mehrdimensionales Array speichern - Problem



  • Hallo ich habe folgendes Problem und komme einfach nicht weiter.

    Ich habe eine .txt Datei in der ich verschiedene Wörter der Länge 3-6 Zeichen habe. Jedes Wort steht in einer neuen Zeile:
    (Auszug aus Datei:
    ACHT
    AKT
    ALTER
    AMSELN
    )

    Jetzt möchte ich ein C-Programm schreiben dass mir diese Datei öffnet, dann die Zeilenlänge erfasst und daraus ein dynamisches Feld erstellt und hier alle Wörter reinschreibt.
    Ich habe schon folgenden Ansatz aber leider schreibt er mir die geöffnete Datei nicht in das Textfeld:

    int main(int argc, char* argv[]){

    //-----Wörterblock einbinden
    FILE *pTextBlock;
    pTextBlock = fopen ("Worte.txt","r");
    if(pTextBlock == NULL) {
    fprintf(stderr, "Fehler beim Oeffnen der Datenbank...\n");
    return EXIT_FAILURE;}

    //-----Wörterblocklänge erfassen
    int Zeilen=0;
    char c[7];
    while(fscanf(pTextBlock, "%s", &c) != EOF) Zeilen++;
    printf("%i", Zeilen);

    //-----dynamischen Speicher anlegen
    int MAX = Zeilen;
    char **TextListe;
    TextListe = (char **) malloc(Zeilen*7*sizeof(char));

    //-----.txt in Feld convertieren
    for (int t1=0; t1<MAX; t1++){
    for (int t2=0; t2<7; t2++){
    fscanf(pTextBlock, "%c", &TextListe[t1][t2]);
    } }
    }

    Kann mir bitte jemand helfen? Verzweifle gerade total...



  • Ok, habe es nochmal umgeschrieben:

    int main(int argc, char* argv[]){
    //-----Wörterblock einbinden
    	FILE *pTextBlock;
    	pTextBlock = fopen ("Worte.txt","r");
    	if(pTextBlock == NULL) {
    	  fprintf(stderr, "Fehler beim Oeffnen der Datenbank...\n");
    	return EXIT_FAILURE;}
    
    //-----Wörterblocklänge erfassen
    	int Zeilen=0;
    	char c[7];
    	while(fscanf(pTextBlock, "%s", &c) != EOF) Zeilen++;
    	printf("%i", Zeilen);
    
    //-----dynamischer Speicher
    	int MAX = Zeilen;
        // Erste Dimension initialisieren  
    	char** TextListe = new char*[Zeilen];  
        // Zweite Dimension Anhängen  
             for (int init=0; init<Zeilen; ++init){
    	TextListe[init] = new char[7]; } 
    
    //-----.txt in Feld convertieren
    	for (int t1=0; t1<=MAX; t1++){
    	    fgets(c, 7, pTextBlock);
    	    TextListe[t1]=c;
             }
    }
    

    jetzt habe ich aber das Problem dass mir alle Zeilen in TextListe mit dem selben Wort gefüllt werden 😡

    BITTE HELFT MIR!!



  • Könnte es vielleicht daran liegen das du die Variable pTextBlock vor dem Konvertieren in das Textfeld via einem Seek wieder auf den Dateianfang stellen musst?

    Grüsse
    Tobi



  • du meinst mittels

    fseek(pTextBlock, 0L, SEEK_SET);
    

    ???

    das funktioniert auch nicht...



  • ...
     for (int t1=0; t1<=MAX; t1++){
            fgets(c, 7, pTextBlock);
            TextListe[t1]=c;
             }
    

    Vielleicht solltest du mal ein strcpy anstatt Texliste[t1] = c versuchen.

    Grüsse
    Tobi



  • Dann bringt ermir nur Errors. Also wenn ich das Programm halt ausführe.

    du meintest ja schon

    for (int t1=0; t1<=MAX; t1++){
    			fgets(c, 7, pTextBlock);
    			strcpy(TextListe[t1],c);
    		}
    


  • Was bringt er dir den für Fehlermeldungen?



  • Dass der Vorgang "written" im Speicher nicht ausgeführt werden kann.
    Beim Debuggen verlangt er dann eine Quellcodesuche für FGETS.C



  • so, hab jetzt mal screenshots von den Fehlermeldungen gemacht.
    Vielleicht kann man mir so besser helfen:

    http://img.instantgallery.de/t/tobe84/2623928.jpg
    http://img.instantgallery.de/t/tobe84/2623929.jpg



  • Hallo Tobe,

    hab mir jetzt mal die Mühe gemacht und den Code umgeschrieben. Bei mir klappt's jetzt.

    int main(int argc, char* argv[])
    { 
    //-----Wörterblock einbinden 
        FILE *pTextBlock = NULL; 
        pTextBlock = fopen ("Worte.txt","r"); 
        if(pTextBlock == NULL) 
        { 
          fprintf(stderr, "Fehler beim Oeffnen der Datenbank...\n"); 
          return EXIT_FAILURE;
        } 
    
    //-----Wörterblocklänge erfassen 
        int Zeilen=0; 
        char c[7]; 
        while(fscanf(pTextBlock, "%s", &c) != EOF) Zeilen++; 
        printf("%i", Zeilen); 
    
    //-----dynamischer Speicher 
        int MAX = Zeilen; 
        // Erste Dimension initialisieren   
        char** TextListe = (char**)malloc(Zeilen * sizeof(char*));   
        // Zweite Dimension Anhängen   
             for (int init=0; init<Zeilen; init++){ 
       		TextListe[ init ] = (char*)malloc(7* sizeof(char));
             }
    	fseek(pTextBlock, 0, SEEK_SET);
    //-----.txt in Feld convertieren 
        for (int t1=0; t1<MAX; t1++){ 
            fgets(c, 7, pTextBlock); 
            strcpy(TextListe[t1], c); 
    	printf("%s", TextListe[t1]);
             } 
         for(int i = 0; i < Zeilen; i++)
    	free(TextListe[i]);
         free(TextListe);
    return EXIT_SUCCESS;
    }
    

    Dein Problem ist, dass du irgendwo über den Speicherbereich gelaufen bist, wahrscheinlich bei der Ausgabe/Kopierschleife. t1 < MAX muss es heißen.

    Desweitern hab ich deine Speicherallokierung umgestellt, da du ja im C Forum postest.

    Grüsse
    Tobi



  • Danke!
    Also jetzt ist dieser Fehler behoben.
    Aber es taucht ein anderer auf 😞
    Ich werd hier echt noch verrückt mit diesem Dreck!

    Der Fehler kommt beimausführendes Programms und lautet:

    Debug Assertion Failed!

    Program: ...ft VisualStudio\MyProjects\Textexpress\Debug\Textexpress.exe
    File: dbgheap.c
    Line: 1011

    Expression: _CrtIsWalidHeapPointer(pUserData)

    Forinformationonhowyour program can causean assertion failue, see the Visual C++ ducumentation on asserts.

    (Press Retry to debug the application)

    und beim debuggen verlangt er dann Pfad für DGBHEAP.C (gleiches Fenster wie in meinem Obrigen Post)
    Was kann das nur sein?



  • Schau mal nach ob er überhaupt Speicher bekommt, für die Strings.

    int main(int argc, char* argv[])
    { 
    //-----Wörterblock einbinden 
        FILE *pTextBlock = NULL; 
        pTextBlock = fopen ("Worte.txt","r"); 
        if(pTextBlock == NULL) 
        { 
          fprintf(stderr, "Fehler beim Oeffnen der Datenbank...\n"); 
          return EXIT_FAILURE;
        } 
    
    //-----Wörterblocklänge erfassen 
        int Zeilen=0; 
        char c[7]; 
        while(fscanf(pTextBlock, "%s", &c) != EOF) Zeilen++; 
        printf("%i", Zeilen); 
    
    //-----dynamischer Speicher 
        int MAX = Zeilen; 
        // Erste Dimension initialisieren   
        char** TextListe = (char**)malloc(Zeilen * sizeof(char*)); 
        if(Texliste != NULL)
        {
        // Zweite Dimension Anhängen   
             for (int init=0; init<Zeilen; init++){ 
               TextListe[ init ] = (char*)malloc(7* sizeof(char));
               if(TexListe[ init ] == NULL)
               {
                 printf("Kein Speicher!");
                 return EXIT_FAILURE;
               }
             }
        }
        else
        {
          printf("Kein Speicher!");
          return EXIT_FAILURE;
    
        }
        fseek(pTextBlock, 0, SEEK_SET);
    //-----.txt in Feld convertieren 
        for (int t1=0; t1<MAX; t1++){ 
            fgets(c, 7, pTextBlock); 
            strcpy(TextListe[t1], c); 
        printf("%s", TextListe[t1]);
             } 
         for(int i = 0; i < Zeilen; i++)
        free(TextListe[i]);
         free(TextListe);
        fclose(pTextBlock);
    return EXIT_SUCCESS;
    }
    


  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    /* Konstanten */
    const char *szfile = "worte.txt";
    const int cmaxlinelen = 10;
    
    /* Prototypen */
    void rstrip(char *s);
    
    int main(void)
    {
    	/* LIES ODER STIRB!!
    	 * http://www.joelonsoftware.com/articles/Wrong.html
    	 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs600/html/hunganotat.asp
    	 */
    	FILE *finput = NULL;
    	int i, clines = 0;
    	char **aszlines = NULL, **asztemp;
    	char *sztemp, *szres;
    
    	/* Datei oeffnen */
    	if (!(finput = fopen(szfile, "r")))
    	{
    		fprintf(stderr, "error: fopen()");
    		return -1;
    	}
    
    	/* alle Zeilen lesen */
    	while (!feof(finput) && !ferror(finput))
    	{
    		clines += 1;
    
    		/* Index vergroessern */
    		asztemp = realloc(aszlines, sizeof(*aszlines) * clines);
    		if (!asztemp)
    		{
    			for(i = 0; i < clines-1; ++i)
    				free(aszlines[i]);
    			free(aszlines);
    			fprintf(stderr, "error: realloc()");
    			return -1;
    		}
    		aszlines = asztemp;
    
    		/* Zeile alloziieren */
    		sztemp = malloc(cmaxlinelen);
    		if (!sztemp)
    		{
    			for(i = 0; i < clines-1; ++i)
    				free(aszlines[i]);
    			free(aszlines);
    			fprintf(stderr, "error: malloc()");
    			return -1;
    		}
    		aszlines[clines-1] = sztemp;
    
    		/* reinlesen */
    		/* man merke: cmaxlinelen wird ueberall verwendet */
    		szres = fgets(sztemp, cmaxlinelen, finput);
    
    		/* mein Werk: Zeilenumbruch entfernen */
    		rstrip(sztemp);
    
    		/* leere Zeile? wollen wir nicht */
    		if (!strlen(sztemp))
    		{
    			clines -= 1;
    			free(sztemp);
    		}
    
    		/* sonst ein problem beim fgets()? */
    		if (!szres)
    		{
    			if (feof(finput)) /* EOF ist kein Problem */
    				break;
    
    			fprintf(stderr, "error: fgets()");
    			for(i = 0; i < clines; ++i)
    				free(aszlines[i]);
    			free(aszlines);
    			fclose(finput);
    			return -1;
    		}
    	}
    
    	/* Ausgabe */
    	for (i = 0; i < clines; ++i)
    		printf("Zeile %2d: \"%s\"\n", i+1, aszlines[i]);
    
    	/* aufraeumen */
    	for (i = 0; i < clines; ++i)
    		free(aszlines[i]);
    
    	free(aszlines);
    
    	fclose(finput);
    
    	return 0;
    }
    
    void rstrip(char *s) /* viel Spass beim lesen */
    {
    	int i = strlen(s);
    	while (i-- && (s[i] == '\n' || s[i] == '\r'))
    		s[i] = 0;
    }
    

    zu geniessen mittels:

    gcc -Wall -xc -pedantic -W -Waggregate-return -Wall -Wbad-function-cast -Wcast-align -Wcast-qual -Wchar-subscripts -Wfloat-equal -Wformat-nonliteral -Wformat=2 -Wimplicit-int -Winline -Wlarger-than-1024 -Wmain -Wmissing-braces -Wmissing-declarations -Wmissing-format-attribute -Wmissing-prototypes -Wnested-externs -Wpacked -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wshadow -Wno-strict-aliasing -Wstrict-prototypes -Wswitch -Wtrigraphs -Wuninitialized -Wunreachable-code -Wundef -Wwrite-strings -s -O2 -std=c99 -ansi



  • Aha - Ok, werde das dann am Montag gleich mal ausprobieren. Sag euch dann ob es klappt. Vorher hab ich keinen Zugriff auf das Program.
    Danke schonmal soweit.


Anmelden zum Antworten