» »

C++(bin file) vprašanje

C++(bin file) vprašanje

hexor ::

Pozdravljeni!

Namreč imam naslednje vprašanje iz binarnih datotek:Ali lahko če imam npr. 10 int-ov,4 float-e,2 bool-a ter 6 double-ov določim število byte-ov katero zavzame datoteka,tako da določim sizeof(pod._tip),ter jih seštejem?
Hvala za odgovore!:)

crush ::

ce prav razumem:
ti imas en program v katerem imas samo deklarirane te tipe spremenljivk (v takem stevilu) in te zanima ali bo velikost programa enaka sestevku velikosti posameznih spremenljivk?
ce je to to, potem je odgovor ne :)

hexor ::

Pač jaz sem tako naredil-popravi me če je narobe;) da sem za vsak pod. tip int,float,bool,double določil velikost v byte-ih z metodo sizeof(),ter pomnožil število podatkov z dobljeno velikostjo tj.:
10 podatkov*4 byte(vel-int)
4 podatki*4 byte(vel-float)
2 podatka*1 byte(vel-bool)
6 podatov*8 byte(vel-double)

Zmnožil te vrednosti,je seštel ter dobil vel datoteke.

3p ::

haxor: Da.

da2sn2 ::

3p je izjavil:

haxor: Da.


pozabili ste na MZ oz PE header, .data sekcija, .text sekcija, naslovi na zunanje dinamicne knjiznice, instrukcije za razne sistemske klice, itd... Je mnogo faktorjev kateri vplivajo na velikost binarne datoteke, pri tem pa razlicni prevajalniki lahko dajo razlicno velikost.

ps: binarno datoteko je mozno zapakirati in zmanjsati njeno velikost

tisti zgornji izracun pa bi lahko bil izracun za npr. kolicino porabljenega pomnilnika.. (ta pa lahko variira glede na optimizacije prevajalnika; npr. sizeof za strukturo lahko vrne vecjo velikost kot bi jo mi izracunali, ker se bere npr 4byte naenkrat in lahko pride do "lukenj")

lp

crush ::

Ce kot binarno datoteko govoris o pisanju v datoteko v binarni obliki, potem bo velikost dobljene datoteke bo to kar si ti izracunal.

Ce pa govoris o izvedljivi binarni datoteki (programom), ki ga ti generiras mores vedet, da ce drugega ne, bo poleg oprandov program vseboval tudi ukaze.
int main()
{
  int a,b,c..;

  return 0;
}

Predvajalnik bo za a,b,c.. klical load a, load b.. da bo v te spremnljivke nalozil vrednosti.

Zanimivo branje o izdelavi najmanjsega programa :)

rasta ::

Pozabljate še na data alignment. Tako
struct {
bool a;
int b;
bool c;
};
zavzame 12 bajtov, medtem ko
struct {
bool a;
bool b;
int c;
};
samo 8.

3p ::

rasta: odvisno za kaj gre (binarni program/podatkovna datoteka). V binarni podatkovni datoteki ni data alignmenta (* če shraniš vsak int/bool/float posebej *).

technolog ::

@rasta, tole pa ni res.

Prvič ker velikost int in bool (bajti) ni določena s standardom in je pod različnimi compilerji različna velikost. int je včasih 16, včasih 32, včasih 64 bitov (deli z 8 za bajte), odvisno od sistema. Bool je včasih zapisan z enim bitom, ponavadi pa kar z enim bajtom.

Pa tudi če vzamemo najslabše primere, sepravi 8 bitov za bool in 64 bitov za int, je v obeh prmerih poraba pomnilnika/datoteke 10 bajtov.

Tudi data alignment je compiler dependent, in verjamem da g++ to v vsakem primeru zoptimizira v najbolj ustrezno varianto. Ne dvomim.

Zgodovina sprememb…

noraguta ::

dejmo najprej razčistit ma kateri arhitekturi delaš in zalaj je to problem v asm to gre sicer ne. v kolikor se na libc ali crt sklicuješ . če sprašuješ za izvršilno daTOTEKO. glede rezultatov pa ni problema.
Pust' ot pobyedy k pobyedye vyedyot!

technolog ::

Pomoje OP misli svoje vprašanje za shranjevanje v eksterno datoteko, ker za binary/executable datoteko je logično, da velikost ne more bit ista, ker je še strojna koda programa noter.

In odgovor na vprašanje je dokončno: Da, če boš podatke zapisal v binarni in ne ASCII obliki, potem je tako.

rasta ::

Izkaže se, da data alignment (ter seveda, koliko bitni sistem je) igra vlogo tudi pri zapisovanju na disk.
S tem testnim programčkom dobim drugačni velikosti datotek "s1.dat" in "s2.dat" (12 in 8 bajtov):
#include <stdio.h>

typedef struct {
  char a;
  int b;
  char c7;
} s1;

typedef struct {
  char a;
  char b;
  int c;
} s2;

int main()
{
  const s1 ss1 = { 65, 66, 67};
  const s2 ss2 = { 65, 66, 67};
  FILE *fp;

  printf("s1 je %d.\n",sizeof(s1));
  printf("s2 je %d.\n",sizeof(s2));

  fp = fopen("s1.dat","wb+");
  fwrite(&ss1,sizeof(s1),1,fp);
  fclose(fp);

  fp = fopen("s2.dat","wb+");
  fwrite(&ss2,sizeof(s2),1,fp);
  fclose(fp);

  return 0;
}


Seveda, pa če polja zapišem z neodvisnimi klici fwrite(), dobim najmanjšo možno velikost datoteke (6 bajtov):
  fwrite(&ss1.a,sizeof(char),1,fp);
  fwrite(&ss2.b,sizeof(int),1,fp);
  fwrite(&ss3.c,sizeof(char),1,fp);


In seveda prevajalnik ne sme optimizirati vrstnega reda elementov v struct!

Torej, če povzamem. Metoda za izračun velikosti binarne datoteke, ki jo predlaga hexor v uvodnem postu, ni nujno pravilna!

Zgodovina sprememb…

  • spremenil: rasta ()

technolog ::

Ja, če zapisuješ structe na datoteko, logično.

Jaz sem mislil bolj, da bi jih z eno zanko eno za drugim zapisal v datoteko, kot si navedel v drugem primeru.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Keylogger

Oddelek: Programska oprema
352625 (1352) Blisk
»

[C++] Zapis vector<BOOL> v binarno datoteko

Oddelek: Programiranje
131057 (861) mn
»

[c] Enaki datoteki

Oddelek: Programiranje
71030 (890) Spura
»

Branje binarne datoteke v polje znakov - C++

Oddelek: Programiranje
81789 (1657) Tutankhamun
»

c++ datoteke

Oddelek: Programiranje
464039 (3528) Vesoljc

Več podobnih tem