Avatar billede hygta Nybegynder
27. marts 2003 - 10:05 Der er 7 kommentarer og
1 løsning

Læsning af fil

Jeg skal til at lave noget billederedigeringsprogammel, men det driller lidt. I følgende kode prøver jeg at caste et BMPbillede som en struct med nogle chars i.
char a1 skulle i henhold til BMP-standarten give B
char a2 skulle i henhold til BMP-standarten give M
Og dette kan man ogse verifisere ved, at kigge på et BMPbillede i en teksteditor.

Problemet er at jeg ikke kan få udskrevet BM
Jeg ved der er andre metoder til at hente enkelte karaktere fra en fil, men det SKAL gøres ved at caste dataen som en struct og så udskrive indholdet.

Hvorfor virker det ikke ???????


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

typedef struct jj{
  char a1;
  char a2;
  char a3;
  char a4;
  char a5;
  char a6;
}jj;



int main(void){
  FILE *ggg = fopen("billede.bmp","r");
  jj *ghj = (jj*)ggg;
  printf("\nTypen = %c%c \n",ghj->a1, ghj->a2);
  fclose(ggg);
  return 0;

}
Avatar billede segmose Nybegynder
27. marts 2003 - 10:15 #1
Du læser ikke noget ind og allocker ikke noget plads til det du indlæser.

int main(void){
  FILE *ggg = fopen("billede.bmp","r");
  jj *ghj = new jj;

  assert(fread(ghj, sizeof(jj), 1, ggg)==1);
  printf("\nTypen = %c%c \n",ghj->a1, ghj->a2);
  fclose(ggg);
  return 0;
}
Avatar billede segmose Nybegynder
27. marts 2003 - 10:16 #2
insæt efter linien med new:
assert(ghj);
Avatar billede hygta Nybegynder
28. marts 2003 - 10:19 #3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct jj{
  char a1;
  char a2;
  char a3;
  char a4;
  char a5;
  char a6;
}jj;

int main(void){
  FILE *ggg = fopen("111.100.000.bmp","r");
  jj *ghj = (jj*)ggg;
  assert(fread(ghj, sizeof(jj), 1, ggg)==1);
  printf("\nTypen = %c%c \n",ghj->a1, ghj->a2);
  fclose(ggg);
  return 0;
}

Nu ser filen sådan ud, men nu giver den følgende fejl når jeg prøver at kompilere:

Undefined                      first referenced
symbol                            in file
assert                              /var/tmp/cchPgPRp.o
ld: fatal: Symbol referencing errors. No output written to test
collect2: ld returned 1 exit status



Kan det have noget at gøre med, at jeg anvender et unixsystem....?
Avatar billede hygta Nybegynder
28. marts 2003 - 10:23 #4
Ups... sådan her


int main(void){
  FILE *ggg = fopen("111.100.000.bmp","r");
  jj *ghj = new jj;
  assert(ghj);
  assert(fread(ghj, sizeof(jj), 1, ggg)==1);
  printf("\nTypen = %c%c \n",ghj->a1, ghj->a2);
  fclose(ggg);
  return 0;

}


Og det giver fejl:

test.c: In function `main':
test.c:30: `new' undeclared (first use in this function)
test.c:30: (Each undeclared identifier is reported only once
test.c:30: for each function it appears in.)
test.c:30: parse error before `jj'
Avatar billede olennert Nybegynder
28. marts 2003 - 11:15 #5
hygta> Det ser ud til at din oversætter er en C-oversætter, ikke en C++-oversætter. Prøv følgende:

#include <malloc.h>
#include <stdio.h>
int main(void){
  FILE* ggg = fopen("111.100.000.bmp", "r");
  jj* ghj = (jj*) malloc(sizeof(jj));
  assert(ghj);
  assert(fread(ghj, sizeof(jj), 1, ggg) == 1);
  printf("\nTypen = %c%c\n", ghj->a1, ghj->a2);
  free(ghj);
  fclose(ggg);
  return 0;
}
Avatar billede segmose Nybegynder
28. marts 2003 - 11:38 #6
hygta - jeg gik ud fra du brugte C++ (C plusplus).

Assert'erne er for at fange evt. fejl i et rigtigt program skal de erstattes af diverse fejl-meldinger/behandliger.

olennert - hov, jeg manglede også en delete i mit C++ exemple :) jeg må se at vende mig til at bruge auto_ptr.
Avatar billede olennert Nybegynder
28. marts 2003 - 11:51 #7
segmose> Og det er sådan cirka det eneste man kan bruge std::auto_ptr til. Kig evt. på www.boost.org for at se nogle lidt mere interessante smartpointers. Eller kig i Alexandrescu's Modern C++ Design, hvor han blandt andet har en policy-baseret smartpointer.
Avatar billede hygta Nybegynder
28. marts 2003 - 20:13 #8
Jeg har ikke fået koden til at virke, men jeg har udfra hjælp fra andet sted har jeg fået besvaret mit spørgsmål.

Fopen indlæser IKKE noget i ramområdet selv. Det var stort set det der har løst mit problem.

Tak for hjælpen.
Der er en der har svaret så du får pointene :-)
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