Avatar billede jordan_ulswood Nybegynder
10. august 2004 - 20:07 Der er 7 kommentarer og
1 løsning

Læsning og skrivning til fil

Hej Eksperter!

Jeg har en fil som 1024 bytes stor, og består af binært data i flg. format 0x00XXYYZZ, altså 256 'klumper' af longwords (32 bits aka 4 bytes). Nu er problemet så, at jeg gerne vil bruge førnævnte fil til input i mit program, og så skal programmet lave en ny fil, hvor den første og derefter hver fjerde byte er skåret væk. Altså sådan at jeg efter at have kørt programmet med den første fil som input, efterfølgende har en fil, hvori formatet på dataene i den er 'ren' 0xXXYYZZ gange 256. Den nye fil får dermed en størrelse på 768 byte.

Her er koden til det:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *fp_input,
        *fp_output;
    unsigned char buffer[768];
    int counter;

    if(argc != 2)
    {
        printf("No input file specified..");
        exit(0);
    }
    if(! (fp_input = fopen(argv[1], "rb")) )
    {
        printf("\nCould not open file.\n");
        exit(0);
    }

    while(!feof(fp_input))
    {      //en byte frem fra pos som filepointeren står på
              fseek(fp_input, 1, SEEK_CUR);     
              //tre bytes over i buffer-arrayet fra fp_input
          fread(buffer, 1, 3, fp_input);
        }
   
    fp_output = fopen("new.pal", "wb");
    fwrite(buffer, 768, 1, fp_output);

    fclose(fp_input);
    fclose(fp_output);

    return 0;
}

Det skal helst holdes i ANSI C..

Men er der nogen som kan hjælpe mig? Eller skal jeg uddybe mere?

ps. Hvis det en hjælp har jeg uploadet input filen som skal konverteres til tornado-kompagniet.dk/kode/input.bin
Avatar billede jordan_ulswood Nybegynder
10. august 2004 - 20:12 #1
Eller er der en lettere måde at løse problemet på? Jeg skal bare have konverteret filen så alle nullerne iden bliver fjernede => størrelsen af filen går fra 1024 bytes til 768 bytes...
Avatar billede arne_v Ekspert
10. august 2004 - 20:15 #2
Prøv:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE *fp_input,
        *fp_output;
    unsigned char buffer[768];
    int counter;

    if(argc != 2)
    {
        printf("No input file specified..");
        exit(0);
    }
    if(! (fp_input = fopen(argv[1], "rb")) )
    {
        printf("\nCould not open file.\n");
        exit(0);
    }

    counter = 0;
    while(!feof(fp_input))
    {
        fseek(fp_input, 1, SEEK_CUR);   
        counter += fread(buffer + counter, 1, 3, fp_input);
    }
 
    fp_output = fopen("new.pal", "wb");
    fwrite(buffer, 1, counter, fp_output);

    fclose(fp_input);
    fclose(fp_output);

    return 0;
}
Avatar billede arne_v Ekspert
10. august 2004 - 20:16 #3
Jeg tror iøvrigt at det er hurtigere at skippe de bytes end med fseek.

Men med 1 KB data er det lige meget.
Avatar billede jordan_ulswood Nybegynder
10. august 2004 - 20:29 #4
Meget fint, det virker som det skal :) Tak for hjælpen, bare læg et svar.
Avatar billede arne_v Ekspert
10. august 2004 - 20:38 #5
svar
Avatar billede arne_v Ekspert
10. august 2004 - 20:39 #6
Du havde jo næsten lavet det hele. Jeg måtte kun lige bruge counter til at få
det hele til at hænge sammen.
Avatar billede jordan_ulswood Nybegynder
10. august 2004 - 20:45 #7
Tjae, men jeg havde nok fået stirret mig blind på koden, og så er det altid godt lige at få en anden til at se på den, og det var alle 30 point værd :)
Avatar billede jordan_ulswood Nybegynder
10. august 2004 - 20:48 #8
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester