adatok idonkenti kiirasa fajlokba

Kezdőlap Fórumok Programozás adatok idonkenti kiirasa fajlokba

10 bejegyzés megtekintése - 11-20 / 25
  • Szerző
    Bejegyzés
  • #2197385
    ktibi
    Felhasználó

      Nagyon jo vagy, csak nekem ez az regi-uj fajl generalas kicsit zavaros… Hogyan lesz meg az elso fileom, es utana a tobbi…? Leirnad expliciten a kodban, hogy hogyan gondolod. Csatoltam a kodot!

      Gondolkozom rajta (meg)…

      #2197386
      pointux
      Felhasználó

        Nem, ez így még nem jó. (if ( block > 0 ) blokkban kell mind a két file neve, mert itt másolsz.)
        Van egy file-od, ami mondjuk data_[block].dat, ahol block változik 0/1-tól a blokkok </= számáig, attól függően, hogy 0-val, vagy 1-gyel kezded a file-ok nevének számozását.

        Mivel te olyat akarsz, hogy data_[block].dat tartalma = legyen a data_[block-1].dat tartalmával + az új adatokkal, ezért egyszerre két file-t kell megnyitnod, kiv. az első esetben, amikor csak az az egy file van.

        Az első esetben az index (block) legyen 0.
        Ebben az esetben nincs honnan adatot másolni, tehát csak fel kell tölteni a data_00.dat file-t.

        Az összes többi esetben már létezik file (ami block-1) indexű.
        Tehát a második indexnél (block=1) így alakulnak a műveletek.
        1) copy data_00.dat data_01.dat (másolás)
        2) data_01.dat-ba bemásoljuk még az új adatokat.

        Ezért kellett a feltétel az elején, mert data_-01.dat nyilván nem létezik.

        Erről szól az a ciklus. (Az, hogy valamilyen c/c++ függvénnyel hozol létre új file-t és másolod bele a régi tartalmát, vagy egy rendszer paranccsal, az mindegy. Nyílván a c/c++ függvény hordozható lesz az oprendszerek között.)
        Itt érdemes írni egy

        Code:
        bool copy ( const char */std::string out, const char */std::string in)

        c/c++ függvényt, ami olvasásra megnyitja az „in”-t és létrehozza (bővítéssel) az „out”-ot és bemásolja az „in” teljes tartalmát.
        No és utána lehet beleírni az új adatokat.
        És, ha az index nő, akkor mindig a legutolsó file lesz az in (először a data_00.dat, majd a data_01.dat …) és létrejön egy új indexű out (data_01.dat, data_02.dat…), és mindegyik egyre több adatot tartalmaz… pont úgy, ahogy szeretnéd.

        #2197387
        ktibi
        Felhasználó

          Ezen a bool copy() fuggvenyen szorakozok, de nem jutok ertelmes dologra, tudnal kis segitseget adni? Hogy kellene rendesen megirni?

          Igy probaltam elindulni, de elakadtdam… (Gondolom, mellesleg celszeru lenne ellenoriztetni a fuggyvennyel azt is, hogy letezik-e mar a fajl, amit meg akarok nyitni vagy amibe irni szerenek)

          Code:
          bool copy ( const char */std::string out, const char */std::string in)
          {
          // …

          ifstream f_in(in.c_str(), ios::in );
          ofstream f_out(out.c_str(), ios::in );

          while (!f_in.eof()){
          f_in.read( … )
          if(f_in.bad()){
          return false;
          }
          else{
          f_out.write( … )
          return true;
          }
          f_in.close();
          f_out.close();
          }

          // …

          }

          #2197388
          pointux
          Felhasználó

            Hát én ebben az esetben, szintén nem bonyolítanám túl C++-szal sem, mert ez egy egyszerű probléma. Inkább egy gyorsabb és egyszerűbb C függvényt írnék rá, mint

            Code:
            #define  FILE_BUF_SIZE 1024

            int copy_file ( const char * dst_path, const char * src_path ) {
                    FILE *src_file = NULL;                                 
                    FILE *dst_file = NULL;                                 
                    void *buf = NULL;                                     
                    size_t size;                                           

                    src_file = fopen ( src_path, „rb” );
                    if ( src_file == NULL ) {         
                            printf ( „Error: %s: %s”, src_path, strerror ( errno ) );
                            return 0;                                               
                    }                                                               

                    dst_file = fopen ( dst_path, „wb” );
                    if ( dst_file == NULL ) {         
                            printf ( „Error: %s: %s”, dst_path, strerror ( errno ) );
                            fclose ( src_file );                                   
                            return 0;                                               
                    }                                                               

                    buf = malloc ( FILE_BUF_SIZE );
                    if ( buf == NULL ) {         
                            printf ( „Error: %s: %s”, dst_path, strerror ( errno ) );
                            fclose ( src_file );                                   
                            fclose ( dst_file );                                   
                            return 0;
                    }                                                               

                    while ( !feof ( src_file ) ) {
                            size = fread ( buf, 1, FILE_BUF_SIZE, src_file );
                            if ( ferror ( src_file ) ) {                   
                                    printf ( „Error: %s: %s”, src_path, strerror ( ferror ( src_file ) ) );
                                    free ( buf );                                                         
                                    fclose ( src_file );                                                 
                                    fclose ( dst_file );                                                 
                                    return 0;
                            }                                                                             
                            fwrite ( buf, 1, size, dst_file );                                           
                            if ( ferror ( dst_file ) ) {                                                 
                                    printf ( „Error: %s: %s”, dst_path, strerror ( ferror ( dst_file ) ) );
                                    free ( buf );                                                         
                                    fclose ( src_file );                                                 
                                    fclose ( dst_file );                                                 
                                    return 0;
                            }                                                                             
                    }                                                                                     

                    free ( buf );
                    fclose ( src_file );
                    fclose ( dst_file );

                    return 1;
            }

            Minek egy C függvényt C++-nak megírni, amikor semmilyen előnyt nem jelent… mert jelen esetben nem jelent előnyt. (És azért látszik ennyire komolynak, mert ellenőrzi és kiírja a sok hibát… ha azokat kiveszed, akkor pár sor.)
            Ez egy teljes értékű függvény… ha baj van, akkor 0-val tér vissza és ki is írja a problémát.
            E módon kezelni is lehet a problémát. Mondjuk kilépni.

            Code:
            if ( !copy (…) ) {
                    //hiba kezelése
            }

            Ha C++-t írnék, akkor megírnám rendesen, valahogy így (nyílván nem részletezem, mert rámenne egy nap)

            Code:
            class FileClass {

                    protected:
                            std::string fPath;
                            std::fstream fStream;

                    public:
                            Fileclass ( const std::string& fPath ) { this->fPath = fPath;  }
                            ~FileClass () { this->fStream.close () }                           

                            bool open ( ios_base::openmode openMode = ios_base::in | ios_base::out | ios_base::binary ) {
                                    if ( this->fStream.good () )                                                       
                                            this->fStream.close ();                                                     

                                    this->fStream.open ( this->fPath, openMode );
                                    if ( this->fStream.good () )               
                                            return true;               
                                    else                                 
                                            return false;                 
                                    // persze lehet try catch throw-val is csinálni, de akkor
                                    //ajánlatos saját „kivételkezelőt” is írni, hogy a saját hibákat
                                    //is regisztrálni lehessen                                     
                            }                                                                       

                            // copy operátorok
                            bool operator= ( const FileClass *srcFileClass ) { … }
                            bool operator= ( const std::fstream *srcFStream ) { … }
                            bool operator= ( const std::stringStream *srcSStream ) { … }

                            // hozzáírás
                            bool operator+= …

                            bool remove ()…
                            bool rename ()…
                            bool flush ()…

                            bool exist () const…
                            std::string getFPath () const… (lehet, get nélkül, de akkor a változókat kell megkülönböztetni pl.: _fPath)
                            std::string getError () const…
                            …                         
            };

            #2197389
            ktibi
            Felhasználó

              Ez hogyan nezne ki a nekem megfelelo esetben, amikor meg kell nyitnom egy „in” file-t, letre kell hozni egy „out”-ot is a bovitessel es be kell masolni a regi file tartalmat? Probalok osszehozni egy peldat erre…

              Valahol nekem amugy gubanc van, mert a printf ( „Error: %s: %s”, … ) sorokra forditasnal ezt dobja:

              Code:
              warning: format ‘%s’ expects type ‘char *’, but argument 3 has type ‘int’
              #2197390
              pointux
              Felhasználó

                Ne adj meg namespace-nek az elején soha semmit, mert lehetnek azonos függvények.
                A namespace-t pont azért találták ki, hogy lehessen azonos nevű függvényeket használni.
                pl:
                strerror
                std::strerror
                sajat::strerror

                Ha az egész programot berakod egy std namspace-be, akkor minden változó alapértelmezetten így fog kinézni std::valtozo. (Ha ilyen nincs, csak akkor valtozo.)
                És mivel std::strerror létezik, az kerül használásra, ami nem char*-gal tér vissza, hanem gondolom egy std::string objektummal, így e módszerrel nem használható.
                Vagy használj std::cout-ot, vagy használd a konvertáló c_str függvényét az objektumnak.

                Ill. most megnéztem, hogy van egy olyan lehetőség is, hogy std::printf.
                De ez az egész értelmetlen túlvariálása a dolgoknak. Teljesen jó változatlanul az a C függvény. Ha nincs értelme a C++-nak, akkor nincs értelme. Csak gondolj bele, hogy pl. csak egy string objektumot (ami egy iterátor tároló) mennyivel több memória előállítani és mennyivel több idő kezelni, mint egy sima karaktersort. És nincs értelme, mert a file-nevek nem fognak változni a másolás során… tehát nincs értelme egy iterátor tároló ágyúval lőni erre a szúnyogra.
                Talán egy copy ( stdString.c_str (), …) -tel, jobbal tudok képzelni.
                Nézd meg, hogy pl. egy fstream::open-nek is csak egy karaktersor a paramétere és nem std::string, mert nincs értelme, hogy az legyen.
                (Példaképpen odaírtam, de, akkor viszont mindent módosítani kell a függvényben, amiben szerepel.)

                #2197391
                ktibi
                Felhasználó

                  Renben, ez megoldodott, koszi (valoban string-gel ter vissza).

                  Segitenel veglegesiteni a kodot, hogy fusson? Foleg a blokkos resz foghijas, de csatolom az eddigit.

                  #2197392
                  pointux
                  Felhasználó

                    Nem jól másoltad be a blokkos részt.
                    Pl. ennek sincs így értelme: „copy_function ( „data_%2.2d.dat” , „data_%2.2d.dat” );”
                    Ezek printf formátum stringek. az s(n)printf állítja elő belőle a valódi stringet (behelyettesítéssel).
                    Itt mutatom.
                    Az „// adatok átmásolása (teljesen mindegy milyen módszerrel)” rész is megvan, most már.
                    És kiegészíted ezekkel a hibakezelésekkel az snprintf függvényekhez (mert azt már előtte leírtam és nem másoltam be, mert értelemszerű) és akkor mér csak az izéket kell előállítani és file-ba írni (a block indexűbe, nem a block-1-be)… azt meg te tudod.

                    #2197393
                    ktibi
                    Felhasználó
                      vizsla wrote:
                      … és akkor mér csak az izéket kell előállítani és file-ba írni (a block indexűbe, nem a block-1-be)… azt meg te tudod.

                      Ennel a lepesnel is jol jonne egy kis help…

                      Ez az utolso dolog nem annyira vilagos (meg…) Ez a

                      Code:
                      file_ize_print_format ( … , … );

                      fuggveny hogy nez ki?

                      Code:
                              // az új adatok írása mindegyiknél kell (itt lehet nyitni, zárni a file-t)
                              for ( int data = 0; data < SIZE_BLOCK; data ++ ) {
                              file_ize_print_format ( fstream, ize [ i ] );
                              }
                      #2197394
                      pointux
                      Felhasználó
                        Code:
                        FILE *newfile = NULL;                                 
                        newfile = fopen ( newname, „wt” );
                        // ellenőrzés

                        for (…) {
                        fprintf ( newfile, „%f”, ize [ i ] );
                        // ellenőrzés
                        }

                        //zárás…

                        Gyorsabb, ha egyszerre több ize-t írsz.

                        Code:
                        … „wb”
                        fwrite ( ize, 1, ize_size, newfile );
                        // ellenőrzés

                        Ha struktúrád van pl.:

                        Code:
                        typedef struct {
                        float x;
                        float y;
                        float z;
                        float ize;
                        } pStruct;

                        pStruct pStructs [ 100 ];
                        fwrite ( pStructs, sizeof ( pStruct ), 100, newfile );

                      10 bejegyzés megtekintése - 11-20 / 25
                      • Be kell jelentkezni a hozzászóláshoz.