.txt Datei einlesen und in mehrdimensionales Array speichern - Problem
-
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: 1011Expression: _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.