Kezdőlap › Fórumok › Programozás › adatok idonkenti kiirasa fajlokba
- This topic has 24 hozzászólás, 4 résztvevő, and was last updated 15 years, 6 months telt el by
pointux.
-
SzerzőBejegyzés
-
2009-12-18-18:31 #2197395
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és2009-12-19-11:49 #2197396ktibi 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,b2009-12-19-23:17 #1889391Hello,
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; j2009-12-21-11:23 #2197397Valami 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) {
2009-12-21-16:59 #2197398#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 );
}
}
SzerzőBejegyzés- Be kell jelentkezni a hozzászóláshoz.
legutóbbi hsz