problem mit strings aus textdatei in feld kopieren... brauch dringend hilfe!



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



  • Gandalfus schrieb:

    Wenn du ein Copy&paste Lösung willst geh doch zu fit-for-study.de

    da hab ich nix gefunden.

    bin immer noch nicht weiter.



  • ich habe ma wieder ein problem hiermit. und zwar wenn ich bei der eingabe des file-namens return drücke, wird als standart "testtext" genommen und wenn ich e eintippe wird das programm sofort beendet. gebe ich einen dateinamen ein, wo die datei nicht existiert, wird eine fehlermeldung ausgegeben. das funktioniert auch alles. es gibt standartmäßig die datei testtext, aber wenn ich jetzt "testtext" eintippe, beendet das programm sich sofort. warum? (einige dinge hab ich ma kurzzeitig aus dem code gekommentart)

    #include <stdio.h>
    #include "P:\\Eigene Dateien\\SCHULE\\FH\\Programmieren\\prog1\\pa4\\textanalyse\\fileread.h"
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    
    void dateiname (int* ende, int* name, char* eingabe);
    /*void einlesen (char*(*feld)[26], char* datei);
    void analyse (char*(*feld)[26]);
    void ausgabe (void);*/
    
    int main (void) {
    
    	int   progende=0;
      char  filename[81];
      int   name=0;
    	char* zeigerfeld[26];
    
    	do {
      	name=0;
        while (name==0){
    		 	dateiname (&progende, &name, filename);
        }
      /*  if (progende==0) {
    	 		einlesen (&zeigerfeld, filename);
    			analyse (&zeigerfeld);
          ausgabe ();
        	getchar();
        } else /* leer *;  */
        printf("progende:%d name:%d dateiname:", progende, name);puts(filename);
        getchar();
        clrscr();
     	} while(progende==0);
    
      getchar();
    
    	return 0;
    }
    /******************************************************************************/
    void dateiname (int* ende, int* name, char* eingabe) {
      char test;
    	printf("Programm zur statistischen Analyse von Texten                  "
      	"Dominic Cruse\n\n");
    	printf("Eingabe Dateiname [e=Ende, Return=TESTTEXT] : ");
    	gets(eingabe);
    	if (eingabe[0]=='e' && eingabe[1]==0) {
      	*ende=1; *name=1;
        }
        else if ((strlen(eingabe))==0) {
        	strcpy(eingabe, "testtext");
          *name=1;
        }
        else if (getFileLine(eingabe, &test, 81)==NULL) {
        	printf("\nFehler: Datei nicht gefunden oder Datei leer\n\n[return]");
    
          printf("progende:%d name:%d dateiname:", *ende, *name);puts(eingabe);
        	getchar();
        	clrscr();
        }
    /*  *name=1; */
    }
    


  • else if (getFileLine(eingabe, &test, 81)==NULL)
    

    test ist nur ein char und kein char-array. Die getFileLine()-funktion schreibt also die gelesenen zeichen ab dem zweiten ins computer-nirwana. das kann schon mal einen sofortigen absturz zur folge haben 😃



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

    liefert einen zeiger.

    jetzt aber wieder ein anderes problem. ich bekomm das mit dem zählen einzelner zeichen nicht hin.

    #include <stdio.h>
    #include "P:\\Eigene Dateien\\SCHULE\\FH\\Programmieren\\prog1\\pa4\\textanalyse\\fileread.h"
    #include <string.h>
    #include <stdlib.h>
    #include <conio.h>
    
    void dateiname (int* ende, int* name, char* eingabe);
    void einlesen (char*(*feld)[26], char* datei);
    void analyse (char*(*feld)[26]);
    void ausgabe (void);
    
    int main (void) {
    
    	int   progende=0;
      char*  filename;
      int   name=0;
    	char* zeigerfeld[26];
    
    	do {
      	name=0;
        while (name==0){
    		 	dateiname (&progende, &name, filename);
        }
        if (progende==0) {
    	 		einlesen (&zeigerfeld, filename);
        printf("progende:%d name:%d dateiname:", progende, name);puts(filename);
    			analyse (&zeigerfeld);
          ausgabe ();
        	getchar();
        } else /* leer */;
    /*    getchar(); */
        clrscr();
        free (zeigerfeld);
     	} while(progende==0);
    
    	return 0;
    }
    /******************************************************************************/
    void dateiname (int* ende, int* name, char* eingabe) {
      char* test;
    	printf("Programm zur statistischen Analyse von Texten                  "
      	"Dominic Cruse\n\n");
    	printf("Eingabe Dateiname [e=Ende, Return=TESTTEXT] : ");
    	gets(eingabe);
    	if (eingabe[0]=='e' && eingabe[1]==0) {
      	*ende=1; *name=1;
      }
        else if ((strlen(eingabe))==0) {
          puts("leer");
        	strcpy(eingabe, "testtext");
          puts(eingabe);
          *name=1;
        }
         	else if (getFileLine(eingabe, test, 81)==NULL) {
        		printf("\nFehler: Datei nicht gefunden oder Datei leer\n\n[return]");
        		getchar();
        		clrscr();
        	}
       		 	else {*name=1; puts(eingabe);}
    }
    /******************************************************************************/
    void einlesen (char*(*feld)[26], char* datei) {
    	char textbuffer[81];
      char textende[81];
    	int  i=0, j=0, k=0;                                /*div. Schleifenvariablen*/
    	for (i; i<26; i++) (*feld)[i] = NULL;         /* Zeigerfeld mit NULL belegen*/
      do {
        getFileLine(datei, textbuffer, 81);
      	if (textbuffer[0]!=NULL/*j<10*/) {
    	 		(*feld)[j] = (char*) calloc (strlen(textbuffer)+1, sizeof (char));
    	 		strcpy ((*feld)[j], textbuffer);
        	printf("%d ", j); puts((*feld)[j]); j++;
         } else k=1;
     	} while (k==0);
    }
    /******************************************************************************/
    void analyse (char*(*feld)[26]) {
      char* feldzeiger;
    /* 	extern double buchstaben;
    	extern double woerter;*/
      extern double anzbuchst[29];
    	extern int zeile;
    /*	extern int saetze;
    	extern int zeichen;    */
      int i=0;
    	for (i; i<30; i++) anzbuchst[i]=0;
      zeile=0;
      do {
      	feldzeiger = (*feld)[zeile];
    		printf("\n(z.%d)", zeile); /*puts(feldzeiger);*/
        i=0;
      	do {
         /* if (*feldzeiger>=65 && *feldzeiger<=90)
            for (i; i<26; i++)
            	if (*feldzeiger==(i+65))
              	anzbuchst[i]++;*/
           /*	else if (*feldzeiger>=97 && *feldzeiger<=122)
              for (i; i<26; i++)
            		if (*feldzeiger==(i+97))
              	anzbuchst[i]++;*/
     /*	 printf("%d ", i++);*/
          feldzeiger++;
        } while (*feldzeiger!=10 && *feldzeiger!=0);
    		zeile++;
      } while ((*feld)[zeile]/*zeile<25*/);
    }
    /******************************************************************************/
    void ausgabe (void) {
    /* 	extern double buchstaben;
    	extern double woerter;*/
      extern double anzbuchst[29];
    	extern int zeile;
    /*	extern int saetze;
    	extern int zeichen;         */
    
      int i=0;
      puts("");
    	for (i; i<26; i++) printf("%c: %2.0lf - ", i+97, anzbuchst[i]);
    }
    /******************************************************************************/
    /*static double buchstaben;
    static double woerter; */
    static int zeile=0;
    /*static int saetze;
    static int zeichen;*/
    static double anzbuchst[29];
    

Anmelden zum Antworten