FILE *Stream in einen Array einlesen



  • 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



  • Sieht doch eigenlich richtig aus. Gibts die Sourcedatei überhaupt?
    Swordfish hat doch schön ausführliche Fehlermeldungen eingebaut;
    was gibt dein Programm denn für ein Fehler aus?

    elturco schrieb:

    Ich habe das hier eingefuegt:

    argv[1]= "C:\\Ahnung.as" ;
    argv[2]= "C:\\Resul.as" ;
    

    Oder könnte es sein, daß du zwar die beiden Zeilen eingefügt hast,
    argc aber nicht verändert hast und nachwievor 0 ist?

    Auch wird mit einem

    argv[1]= "C:\\Ahnung.as" ;
    

    Speicher beschrieben der vielleicht gar nicht existiert, falls
    die Länge von argv nur 1 ist (Nur der Programmname).

    Starte das Programm doch einfach mit Übergabe der Dateinamen.

    Achtung: In diesem Fall darfst du den Backslash nicht escapen.

    meinProgramm C:\Ahnung.as C:\Result.as
    


  • wenn du dein programm nicht aus der kommandozeile heraus bedienst, dann oeffne doch einfach mit:

    FILE *input = fopen("die_datei_die_du_willst", "rt" );

    argc gibt an wie viele parameter deinem programm uebergeben werden und argv die parameter...

    btw: um strings in andere strings zu kopieren benutze strcpy und nicht einfach den wert zuweisen...



  • argc aber nicht verändert hast und nachwievor 0 ist?

    argc ist auf 1 gesetzt...

    das Programm wird irgendwie nicht ausgeführt, bekomme auch nicht irgendeine Ausgabe mit "Datei konnte nicht geöffnet werden"
    Habt Ihr das selbst mal ausprobiert ?

    @Moh ich habe es auch so versucht wie Du es beschrieben hast mit "FILE *input....

    keine Fehlermeldung aber auf die Dateien sowohl Input als auch Output wird nicht zugegriffen



  • 🙂 klar, dummer fehler von mir, argc auf 1 setzen bringt ja auch nichts, mit 3 geht es besser...

    Ja es läuft jetzt danke euch, habt mir viel geholfen, echt cool von euch



  • Noch eine Schlussbemerkung, was ist die Bedeutung von argc ? ich mein das kann man auch im Grunde genommen auch weglassen ?
    Swordfish hat sich bestimmt was dabei gedacht klar, aber ich habe da irgendwie keine Bedeutung gesehen...



  • argc ist die anzahl der übergebenen parameter über die komandozeileneingaben also sozusagen die anzahl der elemnte von argv



  • du liest meine beitraege gar nicht erst, oder??? 😡



  • @Moh ich lese schon Deine Beiträge Moh, ich war ein wenig voreilig mit der Frage 🙂

    Danke euch nochmal 🙂


Anmelden zum Antworten