problem mit strings aus textdatei in feld kopieren... brauch dringend hilfe!
-
niemand hier der das versteht? brauch dringend hilfe.
habe jetzt sowas zusammengebastelt:
#include <stdio.h> #include <f:\textanalyse\fileread.h> #include <string.h> #include <stdlib.h> #include <conio.h> int main (void) { char* charzeigerfeld[26]; int j=0; for (j; j<=26; j++) charzeigerfeld[j] = NULL; char* textbuffer; char* string; int i=0; do { getFileLine("testtext", textbuffer, 81); string = (char*) malloc (strlen(textbuffer)+1); strcpy (string, textbuffer); strcpy (charzeigerfeld[i], string); printf("%c", charzeigerfeld[2]); /* zum testen */ /* puts(textbuffer); */ i++; } while (i<8); getchar(); return 0; }
-
#include <stdio.h> #include <f:\textanalyse\fileread.h> // hier keine <> sondern "" benutzen #include <string.h> #include <stdlib.h> #include <conio.h> int main (void) { char* charzeigerfeld[26]; int j=0; for (j; j<=26; j++) charzeigerfeld[j] = NULL; // <26, nicht <= 26, sonst schreibst du ueber die grenze char* textbuffer; char* string; int i=0; do { getFileLine("testtext", textbuffer, 81); // die funktion kenne ich nicht. benutze fopen mit fgets und fclose string = (char*) malloc (strlen(textbuffer)+1); strcpy (string, textbuffer); strcpy (charzeigerfeld[i], string); printf("%c", charzeigerfeld[2]); // sollte nicht funktionieren, weil czf[2] ein zeiger ist. du willst vielleicht czf[i][2] /* puts(textbuffer); */ i++; } while (i<8); getchar(); return 0; }
wenn du nur eine datei einlesen willst, geht das wesentlich besser mit fgets und ein bisschen realloc fuer das zeilenarray und die zeilen selbst...
mach mal kuerzere variablennamen, die keine typbezeichnungen enthalten.
-
das sieht im moment so aus:
#include <stdio.h> #include <f:\textanalyse\fileread.h> #include <string.h> #include <stdlib.h> #include <conio.h> char filename (int* ende); char read (char* zeigerfeld[26]); int main (void) { int progende=0; char* zfeld[26]; do { filename (&progende); read (zfeld); } while(progende==0); getchar(); return 0; } /******************************************************************************/ char filename (int* ende) { printf("[e=Ende, Return=TESTTEXT] : "); char eingabe; scanf(" %c", &eingabe); if (eingabe=='e') *ende=1; return (*ende); } /******************************************************************************/ char read (char* zeigerfeld[26]) { /*char* zeigerfeld[26];*/ int j=0; for (j; j<26; j++) zeigerfeld[j] = NULL; int i=0; char textbuffer[81]; do { getFileLine("testtext", textbuffer, 81); if (textbuffer==NULL) i=26; int a; a=strlen(textbuffer); printf("%d", a); zeigerfeld[i] = (char*) calloc (strlen(textbuffer)+1, sizeof (char)); strcpy (zeigerfeld[i], textbuffer); i++; } while (i<26); return (*zeigerfeld[26]); }
das unterprogramm getfileline ist in dem quelltext oben in fileread.h und / .cpp drin. ich muss keine datei selbst öffnen.
ich werd noch verrückt. das programm gibt mir den halben arbeitsspeicher aus, sobald ich was anzeigen will. irgendwie versteh ich den ganzen zusammenhang zwischen zeigern und strings und feldern nicht glaub ich.
-
-
ja danke, aber das wäre nicht die erste seite die ich gelesen habe!
-
Wie gross muss man den textbuffer wählen. Eine Datei Zeile kann doch länger als z.B 81 Zeichen sein oder?
Gibt es eine Funktion um die Anzahl der Zeichen pro Zeile zu bekommen?
-
> Wie gross muss man den textbuffer wählen.
beliebig> Eine Datei Zeile kann doch länger als z.B 81 Zeichen sein oder?
ja> Gibt es eine Funktion um die Anzahl der Zeichen pro Zeile zu bekommen?
nein und das ist gut so. wenn die zeile nicht reinpasst, meldet sich fgets schon und dann macht man eben einen groesseren puffer und liest weiter.
c ist low level, also ist es genau das, was man erwarten sollte: ein portabler assembler.
-
ich hab jetzt einfach geschireben, dass er 81 zeichen holen soll. erst dann kann man ja mit strlen prüfen, wie lang die zeile ist. jedenfalls denk ich mir das so. das getfileline is von unserem prof vorgegeben.
hier mal mein jetziger stand. funktioniert gar nicht.
#include <stdio.h> #include <f:\textanalyse\fileread.h> #include <string.h> #include <stdlib.h> #include <conio.h> char filename (int* ende, char* eingabe); char read (char* zeigerfeld[26], char* file[81]); int main (void) { int progende=0; char zfeld[26]; do { char filename; filename (&progende, &filename); read (&zfeld, filename); } while(progende==0); getchar(); return 0; } /******************************************************************************/ char filename (int* ende, char* eingabe) { printf("[e=Ende, Return=TESTTEXT] : "); scanf(" %c", &eingabe); if (eingabe=='e') *ende=1; else if (eingabe=='return') *eingabe="testtext"; return (*ende, *eingabe); } /******************************************************************************/ char read (char* zeigerfeld[26], char* file[81]) { int j=0; for (j; j<=26; j++) zeigerfeld[j] = NULL; int i=0; char textbuffer[81]; do { if (NULL == getFileLine(file, textbuffer, 81)) i=26; int a; a=strlen(textbuffer); printf("%d", a); zeigerfeld[i] = (char*) calloc (strlen(textbuffer)+1, sizeof (char)); strcpy (zeigerfeld[i], textbuffer); i++; } while (i<26); return (*zeigerfeld[26]); }
-
hier mal mein jetziger stand. funktioniert gar nicht.
das haettest du jetzt nicht sagen duerfen. lies das:
http://www.fefe.de/ccc/#fragen
http://www.lugbz.org/documents/smart-questions_de.html
-
c.rackwitz schrieb:
nein und das ist gut so. wenn die zeile nicht reinpasst, meldet sich fgets schon und dann macht man eben einen groesseren puffer und liest weiter.
c ist low level, also ist es genau das, was man erwarten sollte: ein portabler assembler.Also so wie ich die Hilfe versteh gibt fgets keine Fehlermeldung zurück wenn die Zeile länger als der buffer ist. richtig?
Beschreibung
Liest einen String aus einem Stream.
fgets liest einen String aus stream in den durch s angegebenen String und bricht ab, wenn entweder ein Zeilenvorschub (\n) gelesen wird oder n-1 Zeichen gelesen wurden. Der Zeilenvorschub wird am Ende von s gespeichert. Anschließend hängt fgets automatisch ein Nullzeichen (\0) an, um das Ende des Strings zu markieren.Rückgabewert
fgets liefert bei fehlerfreier Ausführung den durch s bezeichneten String zurück. Bei Erreichen des Dateiendes oder im Fehlerfall ist der Rückgabewert NULL.
Was ich auch noch angedacht habe ist auslesen mit fgetc. Dann könnte ich ja mit die grööse des Strings immer anpassen.
-
naja, wär trotzdem schön, wenn da jemand was an fehlern erkennen würde.
-
http://www.dinkumware.com/manuals/reader.aspx?b=c/&h=stdio.html#fgets
The function reads characters from the input stream stream and stores them in successive elements of the array beginning at s and continuing until it stores n-1 characters, stores an NL character, or sets the end-of-file or error indicators. If fgets stores any characters, it concludes by storing a null character in the next element of the array. It returns s if it stores any characters and it has not set the error indicator for the stream; otherwise, it returns a null pointer. If it sets the error indicator, the array contents are indeterminate.
wenn buffer[strlen(buffer)-1] == '\n' || feof(datei) dann hast du eine ganze zeile, sonst musst du nochmal lesen.
-
das ist ja ganz schön, aber ich bekomme ja eine ganze zeile durch getfileline übergeben.
"Das Lesen von jeweils einer Zeile aus der Textdatei erfolgt mit dem gelieferten
Unterprogramm GetFileLine, das sich in der Programm-Bibliothek fileread.h/cpp
befindet.
char* GetFileLine( char* PtrFileName, char*PtrTextBuf, int TextBufSize );
Die Funktion liefert bei jedem Aufruf eine Zeile der Textdatei. Als Rückgabewert wird ein
Zeiger auf das erste Zeichen der Textzeile, bzw. bei Öffnungsfehler oder Dateiende die
Konstante NULL geliefert. "
-
dann hast du ja keine probleme mehr mit fgets.
aber den speicher fuer die zeile musst du trotzdem bereitstellen, weil GetFileLine() den ja haben will.
und wenn du zu wenig gibst, dann hast du eben nicht die ganze zeile.dein prof hat entweder unausgereifte lehrmethoden oder ist inkompetent. dafuer kannst du nichts und es ist schade, dass du mit seinen macken (wie z.b. GetFileLine()) leben musst.
-
Wenn du ein Copy&paste Lösung willst geh doch zu fit-for-study.de
wenn buffer[strlen(buffer)-1] == '\n' || feof(datei) dann hast du eine ganze zeile, sonst musst du nochmal lesen.
Müsste es nicht so sein?
const buffersize=100; char *textpuffer; textpuffer = (char*) calloc(buffersize, sizeof(char)); fgets(textpuffer, buffersize, FilePointer) if (strlen(textpuffer)+1==buffersize) && (textpuffer[strlen(textpuffer)]!='\n') //Zeile ist noch länger
-
Gandalfus schrieb:
Müsste es nicht so sein?
nein. buffer[strlen(buffer)] ist immer '\0'. du willst strlen(buffer)-1
statt calloc() waere malloc() besser, da die initialisierung ueberfluessig ist.
-
Ich dachte es gilt:
strlen liefert die Anzahl der Zeichen des Strings s zurück. Das abschließende Nullzeichen wird dabei nicht mitgezählt.
-
Das ist auch kein Wiederspruch zu dem was c.rackwitz sagte. Achja, der Zugriff auf Arrays beginnt mit der 0.
-
richtig.
char foo[] = "ABCD"; printf("foo[%d] = %d", strlen(foo), foo[strlen(foo)]);
-
Ja stimmt dummer Fehler.
Danke für die Hilfe.
mfg