FILE *Stream in einen Array einlesen



  • Hallo zusammen,

    ich moechte eine File Stream Datei in ein char Array einlesen. Habe aber keine Funktion gefunden, die einen Stream in einen Array speichert.
    Kann mir jemand helfen und sagen wie ich das am besten machen kann ???

    File *datei; ---> char text[];

    Gruesse





  • ja die Funktion ist mir ja bekannt, ich moechte das aber in ein char Array einlesen und nicht in einen int



  • elturco schrieb:

    ja die Funktion ist mir ja bekannt, ich moechte das aber in ein char Array einlesen und nicht in einen int

    Dies ist mit fgets möglich. Siehe auch hier: http://www.pronix.de/pronix-627.html

    MfG

    GPC



  • http://maconlinux.net/linux-man-pages/de/fgets.3.html
    fgetc() liefert dir zwar einen int zurück, aber den kannst du nach char transformieren ( meist reicht es einfach "char c = fgetc(FILE)" ) und hast dadurch das Zeichen, der nächste Aufruf gibt dir das nächste Zeichen aus der Datei.

    fgets() liefert dir gleich eine ganze Zeile, wenn dein Array groß genug ist, und du size ausreichend groß wählst.



  • wobei fgetc() geeigneter ist, da man hier die bessere moeglichkeit hat speicher dynamisch zu reservieren...



  • Also ich zeige euch am besten mein Problem, einige werden das bestimmt schon kennen. Ich moechte die Kommentare "// bzw /* " aus einen Programmcode entfernen.
    Ich moechte dazu die Funktion "getRemove" benutzen aber habe ein wenig Probleme damit. Bin auch nicht so vertraut mit C.

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char getRemove(FILE *Stream)
    {
    
      /*  char text[ ] = "Blafasel\n// Comment\nbla bla // und ein Kommentar am ende\nnoch mehr blabla";
    
        printf( "\"%s\"", text );
    
        char *first = text;
    
        while( ( first = strstr( first, "//" ) ) ) {
    
            char *remove = first;
    
        while( ( *remove != '\n' ) && ( *remove != '\0' ) ) {
    
                ++remove;
            }
    
            if( *remove == '\n' ) {
    
                ++remove;
            }
    
            strcpy( first, remove );
        }
    
        printf( "\"%s\"\n", text );
    
        */
    
    }
    
    // Datei wird geoeffnet/gelesen und in eine andere Datei geschrieben
    int Openfile() {
    
       int x;
       int c=0;
       int i = 0;
       FILE *datei;
       FILE *datei2;
       datei=fopen("C:\\Ahnung.as", "r");
       datei2=fopen("C:\\Resul.txt", "w");
    
        if(datei != NULL) {
          while( (c=fgetc(datei)) != EOF)
             {
                 fputc(c, datei2);
                 char c = fgetc(datei2);
    
             }
         }
       else {
          printf("Konnte Datei nicht finden bzw. öffnen!\n");
          //return 0;
       }
        getRemove(datei2);
        return EXIT_SUCCESS;
    
    }
    
    int main()
    {
         Openfile();
    }
    

    Mein Problem ist, ich moechte beim Aufruf von "getRemove(datei2)" die "datei2" vom Typ FILE *Stream in ein Array speichern um damit weiterarbeiten zu koennen.

    Kann einer mir vielleicht sagen, wie ich das am besten machen kann ?

    Gruesse



  • while((c = fgetc(handle auf deine datei)) != EOF)
               array[i++] = (char)c;
    array[i] = '\0';
    

    du musste allerdings darauf achten, dass du ein genuegend grosses array hast

    edit:
    ich schau mir grad mal so deinen quellcode an und stelle fest, dass du dir noch einmal alles von vorne an ueberlegen solltest...

    warum willst du das handle deiner datei an die funktion uebergeben und nicht den text aus der datei?



  • 1. Kaffeewasser aufsetzen
    2. Besorg dir die Länge der Datei
    Dürfte der Rückgabewert von fseek(0, SEEK_END) sein
    3. Setze den Filezeiger zurück
    4. Reservierung eines entsprechend großen Array
    5. In einer Schleife via (char) fgetc(...) die Zeichen ins Array einlesen
    6. Datei schließen
    7. Kaffee holen und genießen.



  • kannst Du mir ein Beispiel dazu geben ? Nur ein kleines dummes Programmstuck...



  • char *machNenArray(const char* dateiName) {
        File *fp = fopen(dateiName, "rb");
        int size = (int) fseek(fp, 0, SEEK_END);
        fseek(fp, 0, SEEK_SET); // oder wie das heißt...
        char* array = (char*) malloc(size*sizeof(char));
        for (int i=0; i < size; ++i)
            array[i] = (char) fgetc(fp);
        return array;
    }
    

    In der aufrufenden Routine dann nicht vergessen,
    den Speicher wieder freizugeben (free(array);)

    Die gesamte Fehlerbehandlung hab' ich aus
    Faulheit mal weggelassen. 😃



  • aber meinen post hast du gelesen?

    das gleiche kannst du auch fuer die laenge anwenden... einfach ein int wert bei jedem durchlauf inkrementieren... und anschliessend mit diese wert speicher anfordern und dann das gleiche nur dass dieses mal in das array gespeichert wird.

    edit: zu langsam

    btw: denk doch auch mal ein wenig nach oder http://pronix.de



  • Ja danke euch schonmal...

    @Moh ja hab ich gelesen, danke nochmal, ja ich gucke mir das mal an...



  • Moh schrieb:

    http://pronix.de

    Tja, da werde ich wohl auf Lehrreiches dieser Website verzichten müssen. 😞

    Ich kann nichts zum Inhalt sagen, aber das tu ich meinen
    Augen mit Sicherheit nicht an. 😃



  • ich meinte vorrangig auch elturco...

    aber warum willst du das deinen augen nicht antun, wenn ich mal so fragen darf??

    ich seh da ehrlich gesgagt nicht verwerfliches dran.



  • Vielleicht hast du mich nicht ganz verstanden?

    Diese Schriftart auf weißem Hintergrund veranlaßt
    meine Augen einen kleinen Bautrupp ins Gehirn zu schicken,
    der dort sofort einen Höllenlärm produziert. 😞



  • 🙂 na okay



  • ich würd's so machen:

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    int main( int argc, char *argv[ ] )
    {
        if( argc != 3 ) {
    
            puts( "usage: fooapp [input file] [output file]\n" );
            return EXIT_FAILURE;
        }
    
        FILE *input = fopen( argv[ 1 ], "rt" );
    
        if( !input ) {
    
            printf( "The input file \"%s\" does not exist!\n", argv[ 1 ] );
            return EXIT_FAILURE;
        }
    
        FILE *output = fopen( argv[ 2 ], "rt" );
    
        if( output ) {
    
            printf( "The output file \"%s\" does already exist!\n", argv[ 2 ] );
            printf( "Should it be overwritten? ( y/n )\n" );
            fclose( output );
    
            if( toupper( getchar( ) ) == 'N' ) {
    
                puts( "aborting..." );
                fclose( input );
                return EXIT_FAILURE;
            }
        }
    
        output = fopen( argv[ 2 ], "w+t" );
    
        if( !output ) {
    
            printf( "The output file \"%s\" could not be created!", argv[ 2 ] );
            fclose( input );
            return EXIT_FAILURE;
        }
    
        char *text;
    
        fseek( input, 0, SEEK_END );
        long input_length = ftell( input );
        fseek( input, 0, SEEK_SET );
    
        text = malloc( input_length + 1 );
    
        if( !text ) {
    
            puts( "Not enough memory! ");
            fclose( input );
            fclose( output );
            return EXIT_FAILURE;
        }
    
        char *in = text;
    
        while( !feof( input ) )
            *in++ = fgetc( input );
    
        *( in - 1 ) = '\0';
    
        fclose( input );
    
        printf( "\n\"%s\":\n\n%s\n\n", argv[ 1 ], text );
    
        char *first = text;
    
        while( ( first = strstr( first, "//" ) ) ) {
    
            char *remove = first;
    
            if( first != text ) {
    
                if( *( first - 1 ) == '\n' )
                --first;
            }
    
            while( ( *remove != '\n' ) && ( *remove != '\0' ) )
                ++remove;
    
            strcpy( first, remove );
        }
    
        first = text;
    
        while( ( first = strstr( first, "/*" ) ) ) {
    
            char *remove = strstr( first, "*/" );
    
            if( !remove ) {
    
                printf( "Compouned statement \"*/\" missing!" );
                break;
            }
    
            strcpy( first, remove + 2 );
        }
    
        printf( "\"%s\":\n\n%s\n\n", argv[ 2 ], text );
    
        fwrite( text, strlen( text ), 1, output );
        fclose( output );
    
        puts( "done\n" );
    }
    

    Greetz, Swordfish



  • Danke Dir Swordfish, dass ist mir eine grosse Hilfe, echt nett von Dir... 🙂

    wie gesagt ich bin nicht so vertraut mit C und haette das in so in kurzer Zeit nicht geschafft... Danke nochmals



  • @Swordfish

    Kannst Du mir mal kurz erklaeren, wie die Dateien geoeffnet werden ? 😉
    Ich habe das hier eingefuegt: argv[1]= "C:\\Ahnung.as" ;
    argv[2]= "C:\\Resul.as" ;

    Aber die Dateien kann ich nicht oeffnen. Eyy nimm mir das nicht uebel, ich habe nicht soviel Ahnung von C.

    Gruesse


Log in to reply