FILE *Stream in einen Array einlesen



  • Wie heißt es in der Signatur eines bekannten Forenmitglieds:
    "I'm still confused, but on a higher level"

    😃

    Greetz, Swordfish



  • @Moh ich habe es so ungefaehr verstanden, es werden 3 Parameter ubergeben, Input, Output und die dritte ist, bin mir nicht so ganz sicher...



  • if( argc != 3 ) {

    puts( "usage: fooapp [input file] [output file]\n" );
    return EXIT_FAILURE;
    }

    wenn du eh nicht ueber kommandozeile bedienst, warum nimmst du den ganen kram denn nicht raus?? dann muss man argc auch nicht auf 3 setzen. und du hast ja schon gelernt, dass argc die anzahl der argumente an das programm zaehlt! ... usw.



  • @Swordfish, mit welcher Funktion kann ich denn die Ausgabe Zeilenweise wiedergeben, d.h. nicht in Form einer Code-Struktur, sondern in Form eines Textes, das z.b. nur 3-4 oder auch mehr Zeilen hat.

    nicht: sondern:

    class Egal class Egal{int b; bla bla}
    {
    int b;
    bla
    bla
    bla
    [/code]}

    Hast Du ne Idee...



  • ich hab das schon rausgenommen Moh :), das ist mir schon bekannt, aber danke Dir..



  • das war kein hinweis oder tipp 😡
    fuehl dich mal ein wenig angegriffen 😉



  • elturco schrieb:

    @Moh ich habe es so ungefaehr verstanden, es werden 3 Parameter ubergeben, Input, Output und die dritte ist, bin mir nicht so ganz sicher...

    😮 Es werden zwar drei Parameter übergeben, aber nicht Input und Output.

    Das kommt doch nur in Pascal vor

    program pascali(Input, Output)...
    

    In C sind es immer noch

    - argc : Anzahl der Kommandozeilenparameter
    - argv : Array der Kommandozeilenparameter
    - envp : Array der Umgebungsvariablen

    Oder hab' ich dich jetzt mißverstanden? 😕



  • elturco schrieb:

    @Moh ich habe es so ungefaehr verstanden, es werden 3 Parameter ubergeben, Input, Output und die dritte ist, bin mir nicht so ganz sicher...

    argv[ 0 ] enthält den Namen des Programms selbst
    argv[ 1 ] enthält den Namen der Eingabedatei
    argv[ 2 ] enthält den Namen der Ausgabedatei

    das sind - Moment bitte, muss mal zählen... - ähm ja, genau 3 (argc).

    elturco schrieb:

    @Swordfish, mit welcher Funktion kann ich denn die Ausgabe Zeilenweise wiedergeben, d.h. nicht in Form einer Code-Struktur, sondern in Form eines Textes, das z.b. nur 3-4 oder auch mehr Zeilen hat.

    nicht: sondern:

    class Egal class Egal{int b; bla bla}
    {
    int b;
    bla
    bla
    bla
    [/code]}

    Hast Du ne Idee...

    ➡ Smart Questions

    Greetz, Swordfish



  • Ja die Frage nochmal hier...

    Ich moechte als Output das ProgrammCode als Text ausgegeben haben und nicht in Form einer Programmstruktur, d.h. hier ein Beispiel um das genauer zu erlaeutern:

    Nicht so

    void main()
    {
       int y;
       int f;
    
    getchat(){}
     usw.
    
    }
    

    sondern so

    class egal{int a;int b;getchar(){}}
    
    usw.
    

    Hast Du dafur eine Idee, sicherlich muss man eine Kleinigkeit aendern oder einfuegen, aber ich komm einfach nicht drauf.

    Gruesse



  • #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <ctype.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 = (char*) 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 );
        }
    
        first = text;
    
        while( *first ) {
    
            if( *first == '\n' ) {
    
                *first = ' ';
            }
    
            ++first;
        }
    
        first = text;
    
        while( *first ) {
    
            for( char *i = first; isspace( *i ); ++i )
                ;
    
            if( ( i - first ) > 1 ) {
    
                strcpy( first, i );
                first = i;
    
            } else {
    
                first++;	        
            }
        }
    
        printf( "\"%s\":\n\n%s\n\n", argv[ 2 ], text );
    
        fwrite( text, strlen( text ), 1, output );
    
        free( text );
    
        fclose( output );
        puts( "done\n" );
    }
    

    input:

    class egal {
        int a;
        int b;
    }
    
    int main( )
    {
        getchar();
    }
    

    output:

    class egal {int a;int b; }int main( ) {getchar(); }
    

    So, jetzt aber ein bisschen eigeninitiative...

    Greetz, Swordfish



  • 🙂 😉


Anmelden zum Antworten