Gå til innhold

[LØST] hente data fra buffer istedet for FILE*


Anbefalte innlegg

før brukte jeg å gjøre slik for å fylle opp variablene mine med riktig data:

FILE *fil= fopen(fileName, "rb");

fread(&variabel1, 2, 1, fil);
fread(&variabel2, 4, 1, fil);
fread(&array, 4, 3, fil);

fclose(fil);

 

nå leser jeg fila fra en zipfil, og har en variabel som ser slik ut:

char* data

hvordan skal jeg hente ut variabler fra data på en lignende måte som fra en FILE-peker.

 

liksom den første kodesnutten sier at de 2 første bytene fra (FILE*) fil skal til variabel1, mens nå vil jeg at de 2 første bytene fra (char*) data skal til variabel1, de 4 neste bytene skal til variabel2 osv.

 

edit: har prøvd å forklare litt mindre knotete :p

Endret av mortizz
Lenke til kommentar
Videoannonse
Annonse

om du bruker C++ kan du gjøre det enkelt v.h.a. stringstream, slik:

 

stringstream ss("25 lars 21 elisabeth");
string navn;
int alder;

ss >> navn;
ss >> alder;
cout << "navn: " << navn << endl;
cout << "alder: " << alder << endl;

ss >> navn;
ss >> alder;
cout << "navn: " << navn << endl;
cout << "alder: " << alder << endl;

 

i C må du jalla med pekere og/eller sscanf ..

Endret av dayslepr
Lenke til kommentar

ja, bruker c++

men, jeg leser fra en binærfil.

 

eksemplet mitt leser første 2 bytes til en bool, (bool er vel egentlig 1byte,men)

neste 4 bytes til en float

og neste 4*3 bytes til et float array f.eks..

 

finnes det ikke noe lignende for binærstrenger? bytestream elns? :p

Endret av mortizz
Lenke til kommentar

For å lese direkte inn i en struct, må alle størrelser være definerte i structen.

char* name er av ubestemt lengde, i motsetning til char name[64].

Eneste som er definert i din struct er int (4).

 

 

Dersom du bruker C++ burde du uansett bruke std::fstream etter min mening :)

Endret av Nazgul
Lenke til kommentar

nå misforstår du..

Fila er allerede lest inn i structen, fra en zipfil, men drit i den..

det er data-variabelen som er relevant her, den inneholder dataen til fila.

 

problemet mitt er altså å få forskjellige variabler til å hente ut verdier fra data på samme måte som fra en FILE-stream, eller noe lignende ihvertfall.. (jeg suger til å forklare ass)

 

men for å repetere det jeg skrev i første innlegg.

før gjorde jeg slik, da jeg leste inn variablene fra ein FILE-pointer:

FILE *fil= fopen(fileName, "rb");

fread(&variabel1, 2, 1, fil);
fread(&variabel2, 4, 1, fil);
fread(&array, 4, 3, fil);

fclose(fil);

 

nå har jeg ikke lenger en FILE-pointer, men en data-variabel av typen char*.

 

finnes det noen metoder for å gjøre noe ala det ovenfor når du kun har tilgang til en peker til minnet (char* data) ?

 

kom gjerne med eksempler! =)

Endret av mortizz
Lenke til kommentar
men for å repetere det jeg skrev i første innlegg.

før gjorde jeg slik, da jeg leste inn variablene fra ein FILE-pointer:

FILE *fil= fopen(fileName, "rb");

fread(&variabel1, 2, 1, fil);
fread(&variabel2, 4, 1, fil);
fread(&array, 4, 3, fil);

fclose(fil);

 

nå har jeg ikke lenger en FILE-pointer, men en data-variabel av typen char*.

 

finnes det noen metoder for å gjøre noe ala det ovenfor når du kun har tilgang til en peker til minnet (char* data) ?

 

kom gjerne med eksempler! =)

5239359[/snapback]

 

Du ønsker med andre ord å kopiere data fra en minneblokk som du har en char-peker til?

 

Da kan du bruke memcpy:

 

const char* data;

memcpy(&variabel1, data, sizeof(variabel1));
data += sizeof(variabel1);

memcpy(&variabel2, data, sizeof(variabel2));
data += sizeof(variabel2);

// ...

Og et tips er å bruke sizeof-operatoren flittig. Koden blir mye lettere å lese både for deg og spesielt for andre. Å skrive konstanter som et tall er generelt veldig dårlig kodepraksis.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...