Anzeige:
Ergebnis 1 bis 12 von 12

Thema: inhalt einer textdartei in variable speichern

  1. #1
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24

    inhalt einer textdartei in variable speichern

    hi
    ich hab das bissher so gemacht:

    #define SYSINFO "/home/reality/C++/TXT" /* get sysinfos */

    char sysinfos[2000] = { 0 };
    FILE *fd;
    fd = fopen(SYSINFO, "r");
    fgets(sysinfos, sizeof(sysinfos), fd);

    Problem:
    in sysinfo wird nur die erste zeile der txtdartei gespeichert!
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  2. #2
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Willst du die GESAMTE Datei in einen String speichern? Nicht unbedngt sehr effektiv aber unter Umständen notwendig....

    Soll ich den Code einer von mir geschriebenen kleinen String-Puffer-"Klasse" (für C) posten? Hab da auch eine Funktion die bis zu einen belibigen Zeichen, das auch EOF sein kann, aus einer Datei einliest.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  3. #3
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24
    ja ich muss das leider alles iin ne variable spiechern wer nett wenn du den code postest
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  4. #4
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Tipp:

    Du musst einen Puffer dynamisch anlegen und ihn vergrößern, wenn du bemerkst, dass er zu klein ist.

    Schau dir test.c und auch strbuf.c selbst an.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  5. #5
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Update zu test.c:
    Code:
    #include <stdio.h>
    
    #include "strbuf.h"
    
    int main( int argc, char * argv[] ) {
       if( argc == 2 ) {
          FILE * fp = fopen( argv[ 1 ], "r" );
    
          if( !fp ) {
             fprintf( stderr, "can not open file: %s\n", argv[ 1 ] );
          }
          else {
             int errnum = 0;
             strbuf_t buf;
    
             /* Der einzige Fehler der auftreten könnte ist ENOMEM: nicht genügend Speicher. */
             if( (errnum = strbuf_init( &buf, STRBUF_BLOCKSIZE )) == 0 ) {
                if( (errnum = strbuf_readall( &buf, fp )) == 0 ) {
                   printf( "%s:\n%s", argv[ 1 ], strbuf_str( &buf ) );
                }
                else {
                   fprintf( stderr, "error while reading from file: %s\n", strerror( errnum ) );
                }
                
                strbuf_destroy( &buf );
             }
             else {
                fprintf( stderr, "error initialising buffer: %s\n", strerror( errnum ) );
             }
    
             fclose( fp );
          }
       }
       else {
          fprintf( stderr, "usage: strbuf_test [file]\n" );
       }
    
       return 0;
    }
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24
    THX
    ich werd das ganze dann nachher mal probieren
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  7. #7
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Hab' strbuf noch etwas aufgemozt: Es wird jetzt nicht mher ein FILE* benötigt, sondern ein filedescriptor. Somit kann man auch von pipes und sockets etc. lesen. Hab auch ein paar macros hinzugefügt, um immer noch FILE* verwenden zu können.
    Weiters hab ich readall etwas verbessert, sollte jetzt performter laufen: nur noch ein read() und realloc() wenn man rausfinden kann wie groß die zu lesenden Daten sind (sprich bei Datein).
    Plus ein kleines Makro damits mit MSVCPP (6.0) kompatiebel ist.
    (Sollte aber POSIX konform programmiert sein, aber MS ist das jan nicht zu 100%.)
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  8. #8
    Registrierter Benutzer
    Registriert seit
    06.05.2004
    Beiträge
    7
    warum liest du nicht einfach zeile für zeile ein? ist einfacher und verschwendet nicht soviel speicher.

  9. #9
    Registrierter Benutzer
    Registriert seit
    07.09.2003
    Beiträge
    24
    wie? und es muss alles in den arry
    .....Gummierbärn hüpfen hier und da und überall das sind die gummiebärn.....

  10. #10
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Original geschrieben von locai
    wie? und es muss alles in den arry
    Ähm... was willst? Versteh die Frage nicht? Was alles soll in welches Array?
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  11. #11
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Hab meinen Code nochmals überhohlt, so das wirklich nur soviel Speicher alloziert wird wie notwendig (Dateigröße - Dateiposition).
    Und auch sonst sind die readall Methoden etwas optimiert.

    Edit:
    Hatte noch einen Fehler und ne "Unschönheit" in strbuf_addstr(). Die korregierte Fassung zum selber patchen :
    Code:
    int strbuf_addstr( strbuf_t * buf, const char * str ) {
       size_t len = strlen( str );
       int errnum = 0;
       
       if( buf->size < buf->curpos + len ) {
           if( (errnum = strbuf_increase( buf, len > STRBUF_BLOCKSIZE ? len : STRBUF_BLOCKSIZE )) != 0 ) {
              return errnum;
           }
       }
    
       memcpy( strbuf_curptr( buf ), str, len );
       buf->curpos += len;
    
       return 0;
    }
    Geändert von panzi (18-05-2004 um 19:27 Uhr)
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  12. #12
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Glaub zwar kaum das es jemanden interessiert, aber ich hab hier mal meine String-Puffer-"Klasse" updated. Sollte jetzt besser laufen.
    Aber anscheinend gibt's möglicherweiße unter manchen implementierungen (Linux 2.6?? Jedenfalls bei "knoppix26" das ich mal probiert hab) damit ein paar probleme. Werd ich noch fixen (ggF. mit #ifdefs).
    Das Problem ist das fpos_t VERDAMT OS abhängig ist, und man nicht annehmen kann, das es sich dabei um nen normalen integralen Datentyp handelt (vieleicht auch ne struct oder 64 bit unsigned integer).
    Ich überlege ob ich nicht doch ftell() verwende...

    Ach ja, strbuf_readto() und strbuf_freadto() sowie strbuf_readln() und strbuf_readln() sind VERDAMMT redundant. Da muss ich auch noch einen besseren Weg finden.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •