Toon posts:

[C] Binary files uitlezen

Pagina: 1
Acties:
  • 94 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik ben vanmiddag begonnen met een simpel compressie tooltje (volgens RLE) en stuit op een probleem.
Ik ben nu zover dat normale ascii strings kan `compressen' met mijn tooltje.
Maar de bedoeling was natuurlijk oa. binary files te kunnen compressen. (zoals bijv bmp, exe, etc.)
Ik heb begrepen dat je hiervoor fread en fwrite kan gebruiken en dat je een gewone FILE descriptor kan gebruiken.
Alleen heb ik geen flauw hoe ik het precies moet aanpakken.
Van de manpage van fread word ik niet bepaald wijzer. (ja k heb google al gebruikt, maar dit resulteert in engelse teksten en dat vind ik niet bepaald fijn voor iets wat ik nog NIET kan )
kan iemand mij misschien even helpen?

Bij voorbaat dank

Verwijderd

ASCII strings haal je met fgets() op, binary data kun je met fread() ophalen. Of je gebruikt gewoon standaard file descriptors met open() en read(). Voor de rest werkt 't hetzelfde.

De reden dat je fread() in plaats van fgets() gebruikt is simpel: je hebt geen regels in binary files, en dus kun je ook niet 1 regel ophalen. Je moet gewoon een block data ophalen.

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
unsigned char buffer[256];
FILE *stream;
const char *file = "/path/to/file.dat";
int data_read;

/* open file in binary mode */
if ((stream = fopen(file, "rb")) == NULL) {
  printf("Failed to open file %s: %s\n",
         file, strerror(errno));
  exit(-1);
}

/* lees data uit file */
while (!feof(stream)) {
  if ((data_read = fread(buffer, sizeof(char), sizeof(buffer), stream)) == 0) {
    printf("Failed to read data from file %s: %s\n",
           file, strerror(errno));
    exit(-1);
  }

  /* ter eigen invulling */
  doe_iets_met_je_buffer(buffer, data_read);
}

fclose(stream);

  • PiepPiep
  • Registratie: Maart 2002
  • Laatst online: 08-06 11:02
Syntax:
FILE *fopen(const char *filename, const char *mode);

Syntax:
int fseek(FILE *stream, long offset, int whence);

Syntax:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
size_t fwrite(void *ptr, size_t size, size_t n, FILE *stream);

Deze functies heb je nodig denk ik.
const char *filename neem ik aan dat je snapt, "mijnfile.bin" bv.
const char *mode is voor binary files lezen "rb" ipv de r van read kan je ook de w van write gebruiken, b geeft aan dat het binary is.
"rb" dus voor de file die je wilt compressen.
"wb" dus voor de file waar de compressed data in moet.
FILE *stream bij fseek is gewoon de file descriptor.
long offset is in bytes.
int whence kan zijn SEEK_SET SEEK_CUR SEEK_END
SEEK_SET telt vanaf het begin van de file. (dus een positief getal)
SEEK_CUR telt vanaf waar je bent gebleven met lezen/schrijven. (negatief of positief getal)
SEEK_END telt vanaf het einde van de file. (dus een negatief getal)
void *ptr is een pointer naar de plek waar de data staat of moet komen.
size_t size is de grootte van de 'dingen' die je wilt lezen of schrijven (gebruik het liefst dus iets van sizeof(struct blabla);
size_t n is het aantal van deze 'dingen' die je wilt lezen of schrijven.

Ik hoop dat je hiermee verder komt, zo niet, hoor ik het wel.

486DX2-50 16MB ECC RAM 4x 500MB Drive array 1.44MB FDD MS-Dos 6.22


Verwijderd

Topicstarter
ok! bedankt voor jullie hulp! :)
het begint al aardig te lukken nu:
code:
1
2
3
4
e-lite:~/rle# du -hs ploink.out
24k     ploink.out
e-lite:~/rle# du -hs gaap.bmp
72k     gaap.bmp


ploink.out is dus de compressed versie

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-08 13:19

.oisyn

Moderator Devschuur®

Demotivational Speaker

kom op heej dit is en blijft gewoon manual werk hoor :{

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Dit topic is gesloten.