[C/C++] Alternative zu getline?

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Leon, 8. Mai 2009 .

Schlagworte:
  1. 8. Mai 2009
    Alternative zu getline?

    Hi,

    suche nach einer Alternative zu getline, da getline auf Mac OS X nicht unterstützt wird.
    Gibt es eine ANSI C Alternative mit der ich einen String einlesen kann, der eine variable Länge haben kann?
    Schonmal vielen Dank im voraus.

    mfg
    Leon
     
  2. 8. Mai 2009
    AW: Alternative zu getline?

    Wieso sollte getline auf Mac OS nicht gehen?

    Welchen Compiler verwendest du?
     
  3. 8. Mai 2009
    AW: Alternative zu getline?

    Du könntest dir alternativ auch selber eben eine Schreiben, entweder mit einem char* Zeiger und dann das ganze selber regeln, oder mit per std::string, jenachdem ob du C oder C++ verwendest.

    Da du aber anscheinend mit C arbeitest (strtok, etc.):

    Code:
    char* getline_copy( FILE* stream )
    {
     char* out = NULL, c;
     size_t len = 0;
     
     if( stream == NULL ) return NULL;
    
     while( '\n' != (c = fgetc(stream)), len++ )
     {
     if( len == 0 )
     {
     out = calloc( 1, 1 );
     }
     else
     {
     out = realloc( out, len+1 );
     }
     
     out[len] = c;
     }
    
     out[len] = 0x00;
     fseek( stream, 1, SEEK_CUR ); // edit: \n überspringen, damit getline auch hinterinander aufgerufen werden kann ;)
    
     return out;
    }
    Du musst den Speicher aber selber wieder freigeben.
    Code ist nicht geprüft.

    PS: getline ist nicht ANSI C, soweit ich weiß.
     
  4. 10. Mai 2009
    AW: Alternative zu getline?

    hmm, hab jetzt mal versucht das umzusetzen und den inhalt der datei komplett in einen string zu schreiben, da mir dan die Auswertung einfacher fallen würde. Nun komm bei der Ausführung des folgenden codes leider immer NULL raus. Verstehe aber leider nicht ganz wieso.

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
     FILE* stream=NULL;
     if ( (stream = fopen("blub.txt","r")) == NULL) {
     fprintf(stderr, "\nKonnte Datei nicht öffnen!");
     exit(EXIT_FAILURE);
     }
     char* out = NULL, c;
     size_t len = 0;
     
     if( stream == NULL ) return EXIT_FAILURE;
    
     while( c = fgetc(stream), len++ )
     {
     if( len == 0 )
     {
     out = calloc( 1, 1 );
     printf("%c",c);
     }
     else
     {
     printf("%c",c);
     out = realloc( out, len+1 );
     }
     
     out[len] = c;
     }
    
     printf("%s",out);
    
     return EXIT_SUCCESS ;
    }
    
     
  5. 10. Mai 2009
    AW: Alternative zu getline?

    Sorry, das liegt am while( ..., len++ ).

    len wird direkt inkrementiert, änder einfach die erste if-Bedingung auf out == NULL, dann sollte das gehen.

    Grüße.
     
  6. 10. Mai 2009
    AW: Alternative zu getline?

    ah ja, stimmt , hätte ich auch selbst drauf kommen können^^
    Vielen Dank, BW ist dir sicher.
     
  7. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.