Bináris fájból adatok kinyerése

Fórumok

Hello!

Van egy bináris fájlom amiben
a mérési eredményeim vannak.

Az a próblémám, hogy ebből szeretném kinyerni az adatokat
rutinszerűen, hogy pl ábrázólni tudjam s
leközölni.

Egy hex editorral meg kerestem a header végét
a header mérete 837 byte, ettől kezdve vannak
az adatok real-ben, 8 byte egy szém
tehát mondjuk gy néz ki az első adatok:
01 AD D8 AB C1 4B 54 40 = 81,1837
F8 93 37 58 3F 85 52 40 = 74,08199
5C 81 05 16 60 6A 51 40 = 69,66211
.
.
.
Egészen az utól só adatigy (ezek amúgy áram erősségek.
Sajnos nem vagyok programoózó s csak fortranban tudok
valamennyire programozni, csa
a bináris filek megnyitását még nem csináltam.
S nem tudom hogy csinálhatnám meg ezt linux alatt.

Ha valakinek van valami ötlete az kérem segítsen.

Hozzászólások

Szerintem c-ben relative egyszeruen meg lehet oldani:


#include <stdio.h>

int main(void)
{
 FILE   *f;
 double  d;
 int     i;

 f=fopen("adatfile.dat","rb");
 fseek(f,837L,SEEK_SET);
 for ( i=0 ; i<ADATPONTOK_SZA'MA && ! feof(f) ; i++ )
  {    fread((void *)&d,1,sizeof(double),f);
       printf("%12g\n",d);
  }
 fclose(f);
 return(0);
}

(fete've, hogy a file-ban a valos szamok reprezentalasa megegyezik az architektura'n haszna'lt reprezentaciojaval, de ha jollattom - es x86-rol van szo - akkor megegyezik ;))

A.

akkor így a headerben is tudok pár paramétert kiolvasni.
jaja, siman, csak

fseek()

-kel rapozicionalsz a megfelelo" helyre, es egy

fread((void *)&param,1,sizeof(type),f);

hivassal kiolvasod az erteket, ahol

type

a

param

parame'ter tipusa (1 byte-os ege'sz: char, 2 byte-os: short, 4 byte-os: int, ...).

akkor mivel nem tuom a mennyi pont van egy fájlban,
de a manualban amit a géphez adtak benne van a max
ponok száma ami lehetséges s azt írom be.

eze'rt van a ciklusban a

! feof(f)

felte'tel is. ha elfogy a file, akkor is fejezze be a kiolvasa'st. de persze az is jo, hogyha valahonnan tudod hogy mennyi pont van a file-ban (pl. pont a header-bo"l).

A.

A segítségeddel elkészült a kis
adat olcasó:

#include

int main(void)
{
FILE *f;
double d;
int i;
int NOF;
double vol [1];
double cur [1000];
double sav;
double step;
double out_v [1000];

f=fopen("07030821.iv","rb");
fseek(f,276L,SEEK_SET);
for ( i=0 ; i<2 && ! feof(f) ; i++ )
{ fread((void *)&d,1,sizeof(double),f);
vol [i] = d;
}

sav= vol [1] - vol [0];

fseek(f,837L,SEEK_SET);
for ( i=0 ; i<1000 && ! feof(f) ; i++ )
{ fread((void *)&d,1,sizeof(double),f);
cur [i] = d;
NOF = i;
}

step= sav/(NOF-1);

out_v [0] = vol [0];

for ( i=1 ; i
{
out_v [i] = out_v [i-1] + step;
printf ("%12g %50g\n", cur[i-1], out_v [i-1]);
}

printf ("%12g %50g\n", cur[NOF-1], out_v [NOF-1]);

fclose(f);
return(0);
}

A headerben kikerestem a min és a max feszültséget, ami
az első áramhoz és az utólsóhoz tartozik a köztes részt
pedig szétosztottam egyenletesen (így már tögéletesen
fisszakapom az IV görbét).

A kérdésem már csak az, hogy hogyan dudom azt megcsinálni,
hogy:
-látszik hogy a forrásban van a file neve, hogyan tudom azt meg csinálni
azt mint egy shel scriptben, hogy a $1 legyen a file név
azaz progi ?

- a másik, hogy egy text file be menyen a kimenet azt csak a pipe >>-al tudom
véghez vinni?

látszik hogy a forrásban van a file neve, hogyan tudom azt meg csinálni
azt mint egy shel scriptben, hogy a $1 legyen a file név

imigyen deklaralod a main()-t:


int main(int argc,char *argv[])
{
 ...
}

ekkor az

argc

az argumentumok sza'ma (mint shell-ben a

$#

, csak 1-gyel tobb), es az

argv[x]

az x-ik argumentum: x=0: a progrma neve, x=1: elso argumentum (

$1

), ...

tehat:


if ( argc >= 2 )  f=fopen(argv[1],"rb");
else              f=fopen("alapertelmezettfile.dat","rb");
if ( f==NULL )
 {  fprintf(stderr,"error: unable to open input file.\n");
    return(1);
 }

az

else

a'gban lehet

f=stdin

is, ekkor a progi az standard input-rol olvassa a kakaot.

másik, hogy egy text file be menyen a kimenet azt csak a pipe >>-al tudom
véghez vinni?


FILE *fw;
fw=fopen("kimenet.dat","wb");

...

e's az osszes

printf(...);

-t lecsereled

fprintf(fw,...);

-ra.

amennyiben megis a kepernyore iratna'd ki, akkor

fw=stdout

a fenti

fopen()

helyett. Erdemes itt is

NULL

-ra csekkolni.

A.

Sziasztok,én egy tök béna,műszaki analfagamma nő vagyok és segítséget kérnék valakitől. Tuti, hogy kiröhögtök, hogy ilyen piti a dolog,de hát egy újszülöttnek ez is új :)
Adott egy word dokumentum. Be szeretném linkelni ennek a doksinak a tartalmát egy fórumra,h onnan meg tudják nyitni. El tudná valaki ezt szájbarágós módszerrel nekem valahogy magyarázni? :))

Saját gépeden található doksit így nem tudsz megosztani másokkal. (pontosabban megtudsz, de akkor kell a gépen webszervernek futni, és a Nagyvilág felől elérhetőnek kell lennie, ez egy otthoni adsl/kábelnet/wireless esetén nem nagyon működik)
dszabo hozzászólásában írt megoldás javasolt...

Mik

Köszönöm a segítséget, kezdem kapizsgálni már a lényeget abból,ahogy leírtátok itt. Ez a 15 napos feltöltés nekem most tökéletes, úgyis csak ideiglenesen kell hogy lássák a doksit.
Szóval kösz mindenkinek! :)