adatok idonkenti kiirasa fajlokba

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

5 bejegyzés megtekintése - 21-25 / 25
  • Szerző
    Bejegyzés
  • #2197395
    ktibi
    Felhasználó

      Elakadtam… Hogy nez ki helyesen? A fajlos manipulacioba belezavarodtam (mit, hogyan nevezunk el)

      Code:
        // blokknyi adat kiszámolása                                     
          for ( int data = 0; data 0 ) {
                                                                       
              filename_size = snprintf ( oldname, FILENAME_PUFFER_SIZE, „data_%2.2d.dat”, block – 1 );
      // Ezt nem tudom hogy kell…
      fprintf ( ” ” , oldname );
                           
      if ( filename_size >= FILENAME_PUFFER_SIZE )
                      exit ( -1 );
                                                         
              // adatok átmásolása
      copy_file ( newname , oldname );

              }
      else {                                                                                                       
              // ez még az első file                                                                                 
              filename_size = snprintf ( newname, FILENAME_PUFFER_SIZE, „data_%2.2d.dat”, block );
      // ezt nem tudom hogy kell…
      fprintf ( ” ” , newname );

      if ( filename_size >= FILENAME_PUFFER_SIZE )
                      exit ( -1 );                   
              }

      // itt kiiratom egy kiindulasi fajlba a nulla indexu blokknyi ize [ i ]-t
      FILE *newfile = NULL;
      newfile = fopen ( newname , „wt” );
      // ellenorzes
      if ( newfile == NULL ){
      printf ( „Error: can’t create file.n” );
      return 1;
      }

              for ( int data = 0; data < SIZE_BLOCK; data ++ ) {
             
      fprintf ( newfile, "%f", ize [ i ] );

              }                                                   

      fclose ( newfile );

      Ezt hogyan erted es hova gondolod beletenni?

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

      Code:
      … „wb”
      fwrite ( ize, 1, ize_size, newfile );
      // ellenőrzés
      #2197396
      pointux
      Felhasználó
        ktibi wrote:
        Elakadtam… Hogy nez ki helyesen? A fajlos manipulacioba belezavarodtam (mit, hogyan nevezunk el)

        Hát, én mondtam, hogy tartsd az egészet a memóriában egy for ciklussal. :DDD

        Code:
        fprintf ( ” ” , oldname );

        Ez nem kell. Az „oldname” már elkészült az előző ciklusban… ezt már csak át kell másolni a „newname”-be (ill azt ekkor hozod létre), majd kiegészíteni az izékkel.

        Code:
        newfile = fopen ( newname , „wt” );

        Ez így nem jó. „at” kell „wt” helyett, mert különben felülírod és csak az új adat lesz benne, a régi nem, amit előzőleg átmásoltál.
        (És az ott a végén jó, mert akár ez az első file-od, akár már van több is, mindenképpen bővíteni kell az új adatokkal.)

        Ez egész pontosan így néz ki:

        Code:
        newfile = fopen ( newname , „ab” );
        size = fwrite ( ize, 1, SIZE_BLOCK, newfile );

        és ez így egyszerre írja ki az összes (SIZE_BLOCK) ize-t. Ez esetben „wb”-vel hozod létre és „ab”-vel nyitod meg bővítésre. Ha size = SIZE_BLOCK, ill a legutolsó esetben size = SIZE % SIZE_BLOCK (azaz a maradék – ha nem osztható a blokk méretével), akkor kiírt minden adatot. Ebben az utóbbi esetben figyelni kell arra, hogy melyik az utolsó ciklus, mert ha nem, akkor random adatot ír ki a végére:

        Code:
        if ( block == ( ( SIZE / SIZE_BLOCK ) + ( ( SIZE % SIZE_BLOCK ) ? 1 : 0 )  – 1 ) ) {
          // ez a legutolsó <, mint SIZE_BLOCK méretű blokk
          size = fwrite ( ize, 1, SIZE % SIZE_BLOCK, newfile );
        } else {
          // minden más esetben a blokk mérete = SIZE_BLOCK
          size = fwrite ( ize, 1, SIZE_BLOCK, newfile );
        }

        És így nem kell ciklus, mert egyszerre írja ki az összes ize-t. (Kicsit gyorsabb is, még a pufferelt módban is, mert nem kell függvényeket hivogatni SIZE_BLOCKx.)

        Azt hiszem, így már jó lesz.
        A mátrix generálást én kivenném a tesztelés idejére. És az izét karakterre változtatnám, hogy egy editorral könnyű legyen ellenőrizni. (Ha a kerekterekkel működik, akkor a float tipussal is fog.)
        SIZE_BLOCK, mondjuk legyen 5, ize=a,b,c,d,e és legyen, mondjuk 12 adat összesen.
        Így mindent tudsz tesztelni.
        Lesz 3 file-od.
        data_00.dat: a,b,c,d,e
        data_01.dat: a,b,c,d,e,a,b,c,d,e
        data_02.dat: a,b,c,d,e,a,b,c,d,e,a,b

        #1889391
        csaba
        Felhasználó

          Hello,

          van nekem a pelda kedveert egy egyszeru kodom, ami egy tomb elemeit irja ki egy fajlba tobbszor, mondjuk 10szer. Azt szeretnem, ha idonkent, mondjuk n=10 lepesenkent kiirathatnam az addig generalt adatokat kulon fajlokba; tehat, ha tomb[] 5 elemet tartalmaz, akkor  minden 5-dik utan az addigiakat szeretnem kiiratni.
          Pl. az elso fajl legyen data_1.dat, mely 5 elemet tartalmaz (1,2,3,4,5), majd a kovetezo lepesben (j=2) irassuk ki az eddigieket, azaz a data_1.dat-beli elemeket es es az ujabb (1,2,3,4,5) elemet, ez lesz data_2.dat, …stb. Ertelemszeruen az utolso data_10.dat fajl 50 elemet tartalmaz.

          Hogyan lehet ezt elegansan megoldani? Elore is koszi!

          Code:
          #include
          #include
          #include
          #define N 10
          using namespace std;

          int main(void) {

          int tomb[] = {1,2,3,4,5};

          ofstream f1;
          f1.open(„data.dat”);
          for(int j=0; j

          #2197397
          ktibi
          Felhasználó

            Valami nem ok. Lefordul es fut is, csak nem jol csinalja. Hol van hiba?

            Elnezest, de csatolni nem tudtam…


            Code:

            #include
            #include


            #include

            #include

            #include

            #include


            #define SIZE_BLOCK 5

            #define SIZE 12

            #define FILENAME_PUFFER_SIZE 32

            #define FILE_BUF_SIZE 1024


            using namespace std;


            int copy_file ( const char * , const char * );

            // main function

            int main(void) {


            #2197398
            pointux
            Felhasználó

              #define ELEMENTS_SIZE 5
              #define FILENAME_SIZE 16


              int get_filename ( char *filename, size_t size, int index ) {

              int str_size = snprintf ( filename, size, "data_%d.dat", index );


              if ( str_size >= size ) {

              printf ( "Error: Filename is too long." );

              return 0;

              }


              return 1;

              }


              int fprint_func () {

              int elements [ ELEMENTS_SIZE ] = { 1, 2, 3, 4, 5 };

              char oldname [ FILENAME_SIZE ];

              char newname [ FILENAME_SIZE ];


              for ( int i = 0; i < 10; i ++ ) {

              if ( !get_filename ( newname, FILENAME_SIZE, i + 1 ) )

              exit ( -1 );


              if ( i != 0 ) {

              if ( !get_filename ( oldname, FILENAME_SIZE, i ) )

              exit ( -1 );

              if ( !copy_file ( newname, oldname ) )

              exit ( -1 );

              }


              FILE *newfile = NULL;


              newfile = fopen ( newname, "ab" );

              if ( newfile == NULL ) {

              printf ( "Error: %s: %s", newname, strerror ( errno ) );

              exit ( -1 );

              }


              fwrite ( elements, sizeof ( int ), ELEMENTS_SIZE, newfile );

              if ( ferror ( newfile ) ) {

              printf ( "Error: %s: %s", newname, strerror ( ferror ( newfile ) ) );

              fclose ( newfile );

              exit ( -1 );

              }


              fclose ( newfile );

              }


              }

                

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