fgets - Frage zu Parametern



  • Hi.

    Ich bin neu hier und beschäftige mich momentan mit den Grundlagen von C. Nun arbeite ich mit Dateien und möchte auch eine Datei einlesen. Diese Datei ist so aufgebaut:

    01 1885667 0023980 0022116 001 0000000 000 0000000 000
    01 1901225 0023873 0022200 001 0000000 000 0000000 000
    01 7149076 0027900 0026505 002 0000000 000 0000000 000
    01 0648480 0029144 0027235 001 0000000 000 0000000 000
    usw., ...

    Schaut euch mal bitte folgenden Code an:

    #include <iostream>
    #include <stdlib.h>
    
    FILE *fe;
    char *filename
    
    int main(int argc, char *argv[])
    {
      filename = "datei.dat";
      if ((fe = fopen(filename, "rw")) == NULL) { 
       fprintf(stderr, "Datei kann nicht geladen werden! Vorhanden?\n\n");
        system("PAUSE");
       exit(1);
      }
       else
      {
       while(fgets(?, ?, fe) != NULL) {
        fputs(?, stdout);
       }
      }
     return 0;
     fclose(fe);
    }
    

    Ich habe die Parameter, welche ich bei fgets nicht verstehe mit einem Fragezeichen gekennzeichnet. Kann mir diese jemand erklären? Habe schon im Internet und in Bücher gelesen, aber immer anderster erklärt und nun bin ich verwirrt, ... Würde mich also freuen, wenn es mir jemand anhand eines Beispieles erklären würde.

    Und eine weitere Frage: fgets ist ja für das Zeilenweise auslesen gedacht. Woher bekomme ich die aktuelle Zeile, damit ich diese eventuell bearbeiten und wieder ausgeben kann?

    So, dies sind meinee Fragen und ich hoffe ihr könnt mir helfen.

    Vielen Dank, Grüße
    Chris



  • Also:
    fgets (char, int, FILE)

    das char zeigt auf einen string, in welchen du das ablegst was du aus der Datei einlesen möchtest. int ist die anzahl der Zeichen die du einlesen möchtest (entweder bis int-1 zeichen oder bis zum Ende der Zeile), und FILE ist die Datei aus der du Daten einlesen möchtest.

    Bei fputs ist das ähnlich. Dein Fragezeichen steht da für den string, der ausgegeben werden soll.

    Ich hoffe ich konnte dir helfen.



  • #include <stdio.h>
    
    int main ()
    {
        FILE* file = fopen("datei.dat","rw");
        if(file)
        {
            // fgets(char* Buffer, int BufferSize, FILE* Stream);
            // Das heißt, dass wir einen Buffer für die Textzeile übergeben müssen und die Größe dieses Buffers, hier hast du dann auch die Zeile die du gewünscht hast um sie verändern zu können!
    
            char Buffer [256]; // Maximale Zeilenlänge für uns 256
            int BufferSize = 256;
    
            while(fgets(Buffer,BufferSize,file)>0)
            {
                 // verändere Buffer wenn gewünscht
                 fputs(Buffer,stdout); // hier reicht es nur den Buffer zu übergeben, eine Größe ist nicht notwendig
            }
    
            fclose(file); // Wenn du etwas in eine Datei schreibst musst du diese wieder ordnungsgemäß schließen, dies hast du aber nie getan. Jeglicher Code hinter einem return wird nicht mehr ausgeführt!
        }
        return 0;
    }
    

    Ich hoffe, dass ist einigermaßen verständlich.

    MfG SideWinder



  • Funktion *fgets(char *s, int size,FILE *stream)
    Du liest aus dem File "stream" (in deinem Fall fe), eine String (*s) mit einer maximalen Zeichenanzahl von (size) aus.

    fputs(const *str,FILE *stream)
    Du gibst einen String (str) auf einen Filestream (*stream) aus,
    wobei z.B. stdout die Standartausgabe(Bildschirm) ist.

    [b]/* #include <iostream>  iostream is C++ */
    #include <stdio.h> [/b]
    #include <stdlib.h>
    
    [b]#define MAXBUF 256[/b]
    
    FILE *fe;
    [b]/* char *filename;  falsch */[/b]
    char filename[]={"datei.dat"};
    char buffer[MAXBUF];[b] /* string mit maximal 256 Zeichen */[/b]
    
    int main(int argc, char *argv[])
    {
    [b]/* filename = "datei.dat"; funktioniert so nicht in C */[/b]
      if ((fe = fopen(filename, "r")) == NULL) { [b]/* nur "r" für lesen */[/b]
       fprintf(stderr, "Datei kann nicht geladen werden! Vorhanden?\n\n");
        system("PAUSE");
       exit(1);
      }
       else
      {
       while(fgets([b]buffer, MAXBUF[/b], fe) != NULL) {
        fputs([b]buffer, stdout[/b]);
       }
      }
     return 0; [b]/* nach return 0 wird Proggi beendet, somit das fclose niemals ausgeführt */[/b]
     fclose(fe);
    }
    


  • Vielen Dank für die Antworten. Nun klappt es und ihr habt mir toll geholfen und es auch super erklärt, besser als in jedem Buch. Nun habe ich wieder etwas gelernt, danke. 🙂



  • chris_davidi schrieb:

    Hm, ... Danke für die Antwort. Aber was muss ich reinschreiben, wenn ich bis zum Ende der Zeile lesen will? Denn, wenn ich ein Wert eingebe, ließt er ja nur bis dahin, oder?

    fgets() liest doch bis zum Ende der Zeile, mehr als 256 Zeichen wird deine Zeile schon nicht haben. Wenn du das befürchten musst machst du aus 256 eine 1024 und fertig. Funktioniert in C seit Jahrhunderten ohne Probleme 😉

    MfG SideWinder


Anmelden zum Antworten