Datei und Arrays



  • LCC heißt der tolle Compiler 😉



  • Wo liegt denn mein Fehler??

    Das kann ich dir erst sagen, wenn du mir sagt, was in der Datei steht.



  • Habe gerade rausgefunden das man keine Schleife braucht 🙂

    #include <stdio.h>
    #include <stdlib.h>
    
    #define WERT 100
    
    int main(void)
    
    {
    
       char array_a[30];
       FILE *fp;
       int count = 0;
    
       for(count=0;count<30;count++)
    
         {
             array_a[count]=0;
         }
    
       if((fp=fopen("kurs2005.txt","rt"))==NULL)
    
         {
             fprintf(stderr,"Fehler1","kurs2005.txt");
    
         }
    
         fgets(array_a,50,fp);
    
       fclose;
    
       for(count=0;count<30;count++)
    
       {
    
       printf("%c",array_a[count]);
    
       }
    
    return 0;
    
    }
    

    **
    DATEI: Kurs2005
    1122334455
    2222222222
    3333333333**

    Leider wird nur ,,3333333333" angezeigt.
    Die Funktion ,,fgets" springt doch automatisch in die nächste Zeile?



  • Da hast du also 10 Bytes pro Zeile, die eine Zahl darstellen.
    Momentan hast du die als Zeichenkette, wenn du einen Zahlen-Typ willst,
    mußt du das noch umwandeln: man: strtol, dann könnte man auch damit rechnen.

    Die Funktion ,,fgets" springt doch automatisch in die nächste Zeile?

    Jein. fgets liest maximal "50" Zeichen, weniger jedoch falls vorher der Zeilenumbruch kommt. (rtm)

    for(count=0;count<30;count++)
    
       {
    
       printf("%c",array_a[count]);
    
       }
    

    Oder auch einfach

    printf(array_a);
    /* oder */
    printf("%s", array_a);
    

    Siehe man: printf.

    for(count=0;count<30;count++)
    
         {
             array_a[count]=0;
         }
    

    Oder auch einfach

    memset(array_a, 0, 30);
    

    Siehe man: memset.

    fprintf(stderr,"Fehler1","kurs2005.txt");
    

    Da ist noch immer ein Parameter zu viel. Es müsste ein %s im 2. Parameter sein,
    damit das stimmt.

    fclose;
    

    Mein gcc schrieb:

    warning: statement with no effect

    Da hat er reicht. Du meintest

    fclose(fp);
    

    Und falls deine IDE den Code nicht formatieren kann, schau dir auch man: indent an.
    Ich möchte wetten, dass die meisten hier so schlecht formatierten Code gleich gar nicht lesen werden.



  • Ich lade mir am WE einen neuen Compiler.

    Leider bekomme ich aber nur die erste Zeile angezeigt.
    Reicht das:

    for(count=0;count<30;count++)
       {
          printf("%c",array_a[count]);
       }
    


  • Den Code habe ich jetzt mit deinen Vorschlafen verbessert.
    Allerdings bekomme ich immer nur die erste Zeile angezeit.
    Brauche ich noch eine Schleife für gets??
    Der müsste das ja auch ohne Schleife den Umbruch der Zeile erkennen.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    
    {
    
       int array_a[30];
       FILE *fp;
       int count = 0;
    
       memset(array_a, 0, 30);
    
       if((fp=fopen("kurs2005.txt","rt"))==NULL)
    
         {
             fprintf(stderr,"Fehler1","kurs2005.txt");
    
         }
    
      fgets(array_a,30,fp);
    
      fclose;
    
      printf(array_a);
    
    return 0;
    
    }
    


  • Keine Lösung??



  • fgets() liest nur eine Zeile. (wie oft noch?)
    fread() liest im Gegensatz auch über Zeilenumbrüche.

    Bevor ich dir jetzt ein neues Manual schreibe, so liest du die Datei
    in einen Puffer:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char array_a[40];  // 30 war zu klein, weil du 30 Ziffern + mind 2 Zeilentrenner hast = mind. 32
        FILE *fp;
    
        if((fp = fopen("kurs2005.txt","rt")) == NULL)
        {
            fprintf(stderr, "Fehler1: %s", "kurs2005.txt");
            return 1;  // wenn Datei nicht da, wird das Lesen nicht hinhauen
        }
    
        array_a[fread(array_a, 1, 39, fp)] = '\0';  // fread terminiert nicht -- selbst machen
    
        fclose(fp);
    
        printf(array_a);
    
        return 0;
    }
    

    Wenn du aber Zahlen statt einer Zeichenkette willst, solltest du aber zeilenweise
    einlesen und dann umwandeln.

    EDIT:
    Frage mich gerade, ob du den Unterschied zwischen Zahlen-Typen und durch Zeichenketten
    dargestellte Zahlen überhaupt siehst. Siehst du ihn?



  • Ich konnte dieses Problem auf eine andere Weise lösen:

    Die Datei einfach zeichenweise auslesen, '0' subtrahieren, aber beim jeden speichern in das Array darauf achten, das es auch wirklich Zahlen sind.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
       	FILE *fp;
    	int array_a[30];
       	memset(array_a, 0, 30);
    
       	if((fp=fopen("kurs2005.txt","r"))==NULL)
        {
        	fprintf(stderr,"Fehler1: \n","kurs2005.txt");
        	exit(1);
        }
    
      	int j = 0;
      	int tmp;
      	for(; j < 30; )
      	{
      		tmp = fgetc(fp);
      		if(tmp > 47 && tmp < 58)
      		{ 
      			array_a[j] = tmp - '0';
      			j++;
      	    }
    	}
      	fclose(fp);
      	int i = 0;
      	for(;i < 30;i++)
      	{
      		printf("%d",array_a[i]);
      	}
    	return 0;
    }
    


  • Im Prinzip das gleiche wie der Vorposter aber variabler ...

    #define FILENAME "kurs2005.txt"
    #define MAXSIZE  128
    
    (...)
    
        // fill and print array
        memset(numbuffer, 0, MAXSIZE * sizeof(int));
        for(i = 0; i < MAXSIZE && (c = fgetc(fp)) != EOF; ) {
            if(isdigit(c)) {
                numbuffer[i] = c - '0';
                printf("%3d%s", numbuffer[i], (i + 1) % 10 == 0 ? "\n" : "");
                i++;
            }
        }
        printf("\nEs wurden %d Zahlen eingelesen.\n", i);
    
    (...)
    

    Aufpassen bei memset. Das hier greift zu kurz:

    int array_a[30];
    memset(array_a, 0, 30); // ints sind größer als 1 byte
                            // also: memset(array_a, 0, 30 * sizeof(int))
    

Anmelden zum Antworten