URL: https://www.overclockers.at/coding-stuff/stringtables-in-c-befllen-aus-filestream_245668/page_1 - zur Vollversion wechseln!
hi, oc.at
Bin wieder mal zu dumm.
Bitte um Hilfe.
Ich versteh nicht, warum ich meine einzelnen eingelesenen zeilen nicht in meine stringtabelle schön reinbring. Er speichert immer nur den letzten reinkopierten inputstring, ich möcht aber Zeile 1 in bigstring[1] drinhaben, zeile 2 in bigstring[2] usw, usf.
Hätte mich daran orientiert:
http://openbook.rheinwerk-verlag.de..._zeiger_009.htm
Code: C/* ptrptr5.c */ #include <stdio.h> #include <stdlib.h> int main(void) { char *text[500]; char str1[] = "Text1"; char str2[] = "Text2"; char str3[] = "Text3"; text[0] = str1; text[1] = str2; text[2] = str3; printf("%s %s %s\n", text[0], text[1], text[2]); return EXIT_SUCCESS; }
Code: C#include <stdio.h> #include <stdlib.h> #include <getopt.h> #include <windows.h> #define P 100 /***************************************************************************************************************/ /* DynamicText - Ein Programm, welches die Zeilen einer Datei in den Speicher einliest. Die Zeilen werden als */ /* String-Array gespeichert und das String-Array dynamisch verwaltet. Verwendet werden dazu die Funktionen */ /* malloc() und realloc(). Dadurch ist es möglich eine Datei in den Speicher zu laden, ohne vorher zu wissen */ /* wie groß diese Datei ist. */ /* Autor: */ /* Datum: 2016-03-05 */ /***************************************************************************************************************/ /****************************************************************/ /* Main Funktion */ /****************************************************************/ int main (int argc, char *argv[]) { // Speichere alte Farben der Konsole HANDLE h = GetStdHandle ( STD_OUTPUT_HANDLE ); WORD wOldColorAttrs; CONSOLE_SCREEN_BUFFER_INFO csbiInfo; GetConsoleScreenBufferInfo(h, &csbiInfo); wOldColorAttrs = csbiInfo.wAttributes; /*************************/ /* Variablendeklaration */ /*************************/ // Einlesestring char inputstring[P]; // String, welcher die ganze Eingabe speichert char **bigstring; // Größe des Strings für Speicherallozierung int size=100; //Filepointer FILE *fp; // Zählervariable für Zeilen int k=0; /*************************/ /* Ausgabe Programminfo */ /*************************/ // Ausgabe in der Farbe Rot SetConsoleTextAttribute ( h, FOREGROUND_RED | FOREGROUND_INTENSITY ); printf("-----------------------------------------------------------------------------\n"); printf("| AnalyzeText - Ein Programm AnalyzeText, welches deine Datei zeichenweise |"); printf("\n| einliest. Das Programm sucht nach einem XML-Tag und gibt den Elementnamen |"); printf("\n| und gibt den Inhalt auf die Standardausgabe aus. |"); printf("\n| Version 1.0 |"); printf("\n| Autor: |"); printf("\n| Datum: 2016-03-05 |\n"); printf("-----------------------------------------------------------------------------\n\n"); // Ausgabe in Standardfarben SetConsoleTextAttribute ( h, wOldColorAttrs); // Bildschirmwechsel system("PAUSE"); system("cls"); // Filesttream öffnen im "read only" Modus fp=fopen("uebtext.txt", "r"); // Wenn Speicher nicht alloziert werden könnte, dann Fehlermeldung und Fehlercode 1 Rückmelden if (!bigstring) { fprintf(stderr,"\nError"); return -1; } // Speicher allozieren für String bigstring = (char *) calloc(size, sizeof(char)); printf("\n-----------------------------------------------------------------------------\n"); printf("| Lese Text aus Datei ein |\n"); printf("-----------------------------------------------------------------------------\n\n"); //Wenn fp 0 zurückliefert, also Datei unlesbar oder nicht auffindbar, dann Fehlermeldung if (fp == NULL) { fprintf(stderr,"Datei kann nicht zum Lesen geoeffnet werden\n"); } else { int i=0; // solange Fileende nicht erreicht, auslesen und ausgabe while (fgets(inputstring,P,fp)!=NULL) { // Benötigter neuer Speicher size += strlen(inputstring); // Erweitere benötigten Speicher um die exakte Anzahl des eingelesenen Strings bigstring = (char *) realloc(bigstring, size*sizeof(int)); // Wenn Speicher nicht alloziert werden könnte, dann Fehlermeldung und Fehlercode 1 Rückmelden if (!inputstring) { fprintf(stderr,"\nError"); return -1; } // Zähler, wieviele Zeilen gelesen wurden k++; i++; bigstring[i] = inputstring; // Ausgabe printf("%s",bigstring[i]); } } printf("\nEs wurden %i Zeilen eingelesen\n",k); printf("\n bigstring[1] = %s", bigstring[1]); printf("\n bigstring[2] = %s", bigstring[2]); printf("\n bigstring[3] = %s", bigstring[3]); printf("\n bigstring[4] = %s", bigstring[4]); printf("\n bigstring[5] = %s", bigstring[5]); printf("\n bigstring[6] = %s", bigstring[6]); printf("\n bigstring[7] = %s", bigstring[7]); // Filestream schließen fclose(fp); // Speicher freigeben free(inputstring); printf("\n\n-----------------------------------------------------------------------------\n"); printf("| ENDE |\n"); printf("-----------------------------------------------------------------------------\n\n"); /*************************/ /* Programmende */ /*************************/ system("PAUSE"); return 0; }
Code: Cbigstring[i] = inputstring; // Ausgabe printf("%s", bigstring[i]);
InputString hat ja immer die gleiche Adresse. Du müsstest für jede eingelesene Zeile Memory allozieren und dann den Pointer in das Array schreiben.
Oder du kopierst direkt dir Adresse aus strdup von InputString.
ja stimmt, inputstring hat immer dieselbe Adresse und die Größe P.
Für jede Zeile Memory allozieren will ich ja, aber im bigstring, nicht im inputstring.
will quasi bigstring[1] mit dem aktuellen zeile im inputstring befüllen.
Eine Runde weiter hat inputstring bereits den inhalt der nächsten Zeile statt der Ersten Zeile und die will ich dann in bigstring[2] reinkopieren.
ich will später eben die eingelesenen Zeilen einzeln aufrufen können mit bigstring[1...n]
Deshalb musst du den Speicher ja auch kopieren, den du einliest, und nicht immer in InputString liegenlassen bzw. beim nächsten Mal überschreiben.
Am Ende deines Programmes zeigen alle bigstring[i] auf den gleichen Speicher; deshalb siehst du immer nur die zuletzt eingelesene Zeile.
Mit
kopierst du nichts; damit weist du nur die Adresse von inputstring einem Eintrag in deinem Array zu. Versuch malCode: Cbigstring[i] = inputstring
Und du musst dann am Schluss noch einmal durch bigstring iterieren undCode: Cbigstring[i] = strdup(inputstring)
aufrufen, sonst leakst du Speicher.Code: Cfree(bigstring[i])
alles klar, probier ich dann gleich aus.
danke schonmal
edit: wow, thx haut jetzt hin. auf sowas wär ich nie gekommen, bzw erst nach zig stunden. hab an völlig falscher stelle gesucht jetzt und habs einfach nicht hingebracht.
danke!
da wünsche ich dir bei größeren programmen viel spaß
Zitat von charminZitat von Bogusbtw :scnr: i'd vote for sanders. y? take a look
Code: C// String, welcher die ganze Eingabe speichert char **bigstring;
Code: C// Größe des Strings für Speicherallozierung int size=100;
Code: C// Wenn Speicher nicht alloziert werden könnte, dann Fehlermeldung und Fehlercode 1 Rückmelden if (!bigstring) { fprintf(stderr,"\nError"); return -1; }
Code: C// Speicher allozieren für String bigstring = (char *) calloc(size, sizeof(char));
Code: Cint i=0;
Code: C// Benötigter neuer Speicher size += strlen(inputstring); // Erweitere benötigten Speicher um die exakte Anzahl des eingelesenen Strings bigstring = (char *) realloc(bigstring, size*sizeof(int));
Code: C// Wenn Speicher nicht alloziert werden könnte, dann Fehlermeldung und Fehlercode 1 Rückmelden if (!inputstring) { fprintf(stderr,"\nError"); return -1; }
Code: C// Speicher freigeben free(inputstring);
danke, dass du dir Zeit genommen hast!
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025