hogy lehet egy fájlt szétdarabolni n-byteonként k-fájlra?
tehát mint a cut parancs (a split transzponáltja), csak ugye nem soronként
például n=1, k=3-nál mintha egy raw RGB képet akarnék három képre szétszedni
mindezt hatékonyan, gigabyteokra
c-ben már ugyan megírtam, pár sor az egész, csak kíváncsi vagyok van-e rá valami
- 928 megtekintés
Hozzászólások
dd
udv Zoli
- A hozzászóláshoz be kell jelentkezni
egy kicsit részletesebben?
most így azt sem találom egyáltalán több fájlba hogy lehet írni
- A hozzászóláshoz be kell jelentkezni
dd if=input.file of=output.file.NNN count=mennyi skip=honnan
mindezt egy megfelelo for ciklusba szervezve, bovebben: man dd :-)
udv Zoli
- A hozzászóláshoz be kell jelentkezni
Még ha értenéd mi is akar...
- A hozzászóláshoz be kell jelentkezni
/OFF
koszonom az epito jellegu kritikat, mar az is baj ha segiteni probalok. en elmondtam hogy hogyan probalkoznek
udv Zoli
- A hozzászóláshoz be kell jelentkezni
Nem baj ha segíteni próbálsz, sőt nagyon is jó, de az nem segítség, hogy odavágod neki hogy dd, mielőtt megértenéd mit is szeretne.
- A hozzászóláshoz be kell jelentkezni
en nagyobb blokkokban gondolkodtam nem 1-2 bajtos meretekben, erre a legjobb teljesitmenyu megoldas a celprogram
udv Zoli
- A hozzászóláshoz be kell jelentkezni
SzVSz megértette, csak esetleg még nem csinált dbf fájlból dd-vel txt-t, ami erre egy témavariácó... és persze azt is érdemesebb inkább egyperces programmal.
- A hozzászóláshoz be kell jelentkezni
Első olvasásra én is a split -b-t erőltettem volna, de most ha jól értem "demultiplexálni" szeretnéd a fájlt, és nem darabolni. Ilyen valszeg nincs - illetve már van, hogy megírtad.
dd-vel és a seek/skip kapcsolókkal tényleg meg lehet erőltetni egy szkriptben, de nagy fájl esetén a seekeléssel fog elmenni az idő nagyobb része, szóval mégse.
- A hozzászóláshoz be kell jelentkezni
Ha már megemlítetted a splitet: az miért nem felel meg? Van neki -b (--bytes) opciója, éppen erre jó.
- A hozzászóláshoz be kell jelentkezni
tudnál egy példát mondani? mondjuk az rgb-re?
a split amennyire látom a cut transzponáltját csinálja, tehát előbb az egyik fájt pakolja tele, aztán jön a másik, itt meg felváltva kell
- A hozzászóláshoz be kell jelentkezni
"hogy lehet egy fájlt szétdarabolni n-byteonként k-fájlra?"
Én csak erre a kérdésre válaszoltam. Elnézést, félreértettem, de most már sejtem mit szeretnél elérni. Tehát egy file-ból minden k-adik n byte méretű részt azonos file-ba írtani. (Nem pedig k darab n byte méretű részt külön file-ba.)
- A hozzászóláshoz be kell jelentkezni
echo -n "rgbqweasd" > test.dat
bbe -b :3 -e 'd 1 2' test.dat
^- ez kiszedi a pirosat :)
Az a baj, hogy ez is lassú, és a legjobban úgy jársz, ha azt használod amit c-ben megírtál.
- A hozzászóláshoz be kell jelentkezni
Ez a bbe jó darabnak néz ki. Nem értem, miért spórolják ki tkp. az összes RF/Fedora disztribből.
- A hozzászóláshoz be kell jelentkezni
fedorabol nagyon sok apro de hasznalhato programot kisporolnak :(
udv Zoli
- A hozzászóláshoz be kell jelentkezni
Imho azért, mert tetű lassú, és hamarabb megírod c-ben amit akarsz és lefuttatod, mint ezt kivárd :)
- A hozzászóláshoz be kell jelentkezni
Persze, erre a feladatra garantáltan a házilag összerakott pársoros a leggazdaságosabb, de nem nehéz olyan helyzetet elképzelni, amikor már nem éri meg kódolni és tesztelni.
- A hozzászóláshoz be kell jelentkezni
akkor ideblogom, egyrészt hogy megoldás is legyen, másrészt ha kell megtaláljam, harmadrészt pedig c-ben sohse programoztam és az is régen volt:),
szóval comments welcome
// cut input file (which can be stdin) to count files with
// given prefix by demupltiplexing given blocksize bytes
// usage: cut2 blocksize count input outfilenameformat
// example: raw RGB(3x16=48bit) to 3 gray(16bit) images
// cut2 2 3 raw out%0.3d
// note: writes only full blocksize*count bytes
#include < stdio.h >
#include < stdlib.h >
#include < malloc.h >
#define BUFF 4096 // try to write to each output at least
main(int argc, char **argv) {
int i, j, k, s, c, b, r;
FILE *f, **g;
char gname[255];
unsigned char *x, *y;
s = atoi(argv[1]); // size of block
c = atoi(argv[2]); // count of files
f = fopen(argv[3], "rb"); // input
g = (FILE**)malloc(sizeof(FILE*)*c);
for (i=0; i < c; i++ ) {
sprintf(gname, argv[4], i);//out filename
g[i] = fopen(gname,"wb");
}
b = BUFF/s + (BUFF%s?1:0);
x = (unsigned char*)malloc(s*c*b);
y = (unsigned char*)malloc(s*c*b);
while(r = fread(x,s*c,b,f)) {
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
for(k = 0; k < s; k++)
y[k+s*i+s*j*r] = x[k+s*j+s*c*i];
for(i = 0; i < c; i++)
fwrite(&(y[s*r*i]), s*r, 1, g[i]);
}
for(i = 0; i < c; i++) fclose(g[i]);
fclose(f); free(g); free(y); free(x);
}
- A hozzászóláshoz be kell jelentkezni