.txt Datei einlesen und in mehrdimensionales Array speichern - Problem



  • ...
     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