begin process at 2012 05 30 19:45:49
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Fichier & Disque

 > 

Wad File


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Wad File

lundi 24 mars 2008 à 12:40:23 | Wad File

Nicolas___

Bonjour , voila j'ai un petit probleme pour lire 1 fichier WAD (  wad  )

donc suivant le modele décrit je me suis fait 2 structures :

struct Header
{
       char identification[4];
       int  numLumps;
       int  pInfoTableOfs;
}header;

struct Directory
{
       int filePos;
       int size;
       char name[8];
      
}directory;

et je lis comme cela le fichier : (je poste le "source" ) :

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

#define HERETIC "i:\\MyGames\\dos\\heretic\\heretic.wad"
#define DOOM "i:\\MyGames\\dos\\doom\\doom.wad"
#define DOOM2 "i:\\MyGames\\dos\\doom2\\doom2.wad"


struct Header
{
       char identification[4];
       int  numLumps;
       int  pInfoTableOfs;
}header;

struct Directory
{
       int filePos;
       int size;
       char name[8];
      
}directory;



FILE* ouvrirWad(char *fileName,FILE *file)
{
    return fopen(HERETIC,"r");
}


void lireHeader(FILE *file)
{
     fseek(file,0,SEEK_SET);
     fread(&header,sizeof(struct Header),1,file);
}



int main(int argc, char *argv[])
{
  int i,imax; 
  FILE *file;
 
  file = ouvrirWad(HERETIC,file);
 
  if (file==NULL)
  {
     printf("Fichier Introuvable ! ");
     getch();
     exit(EXIT_FAILURE);
  }
    
     
  // lire le header
  printf("\n* * * * * * * * * * * * * * * * * * * * * * *\n*");
 
  printf("\n*\tHEADER FILE WAD\n*");
 
  lireHeader(file);
  
  printf("\n*\tIdentification WAD:%s\n",header.identification);
  printf("*\tnombre de lumps : %d\n",header.numLumps);
  printf("*\tpointer vers directory : %d\n*\n*",header.pInfoTableOfs);
 
  printf("\n*\n* * * * * * * * * * * * * * * * * * * * * * *\n");
 
  // on se positionne sur le directory
 
  printf("\nPositionnement sur le dossier ...\n");
 
  fseek(file,header.pInfoTableOfs,SEEK_SET);
 
  printf("Position dans le fichier %d \n\n",ftell(file));
 
  printf("Lecture du directory: (pos : %d)\n\n",ftell(file));
 
  //lecture du directory
  fread(&directory,sizeof(struct Directory),1,file);

  // infos
  
  printf("pointer vers fichiers : %d\n",directory.filePos);  
  printf("taille en bytes du lump: %d\n",directory.size);  
  printf("nom du directory : %s\n",directory.name);
 
  system("PAUSE");   
 
  fclose(file);

  return EXIT_SUCCESS;
}

Bon ce code fonctionne , je trouve les bon renseignements dans le HEADER , je me positionne sur le directory , il s'appelle PLAYPAL (j'ai verifié avec 1 autre logiciel et c'est juste )

Mon probleme est le suivant : comment trouver les autres directory , je ne comprends pas , il n'y a plus aucuns renseignements sur ou trouver les autres ?

Si qq1 connais la solution

Merci





lundi 24 mars 2008 à 13:01:28 | Re : Wad File

jfrancois

Réponse acceptée !
Bonjour,

Vu la description sur Wiki; les "numlumps" directories sont les uns derrière les autres tout simplement ! Il faut faire une boucle qui fait "numlumps" fread(&directory).

Jean-François

lundi 24 mars 2008 à 13:13:38 | Re : Wad File

Nicolas___

Ok t'as solution est bonne . . . j'avais pas fait gaffe merci .

Mais j'ai 1 bleme , tt est bon au debut puis tt d'1 coup dans la section E1M2 je boucle sur REJECT ?

ma boucle

//lecture du directory
     fread(&directory,sizeof(struct Directory),1,file);
 
 
     // infos
     printf("pointer vers fichiers : %d\n",directory.filePos);  
     printf("taille en bytes du lump: %d\n",directory.size);  
     printf("nom du directory : %s\n",directory.name);

 i=0;
  iMax=header.numLumps;
 
  while(i<=iMax)
  {
     //lecture du directory
     fread(&directory,sizeof(struct Directory),1,file);
 
 
     // infos
     printf("pointer vers fichiers : %d\n",directory.filePos);  
     printf("taille en bytes du lump: %d\n",directory.size);  
     printf("nom du directory : %s\n",directory.name);
     i++;
    
     getch();
              
  }

comprends pas !
 

lundi 24 mars 2008 à 13:43:59 | Re : Wad File

jfrancois

Je ne connais pas du tout le détail de ces choses là mais sur Wiki, REJECT semble être une donnée tout à fait prévue et valable !

Jean-François

lundi 24 mars 2008 à 13:53:07 | Re : Wad File

jfrancois

D'autre part, l'identificateur dans la structure header et le nom dans la structure directory ne sont pas des chaînes de caractères au sens C (c'est à dire terminées par un zéro binaire) mais de simples tableaux de caractères (sauf pour le nom s'il est plus court que 8 caractères puisqu'il est sensé être comblé avec des 0). L'affichage avec un %s ne fonctionne pas ! il faut %4.4s pour l'identificateur et %-8.8s pour le nom.

Jean-François

lundi 24 mars 2008 à 13:55:24 | Re : Wad File

Nicolas___

Je ne connais pas du tout le détail de ces choses là mais sur Wiki, REJECT semble être une donnée tout à fait prévue et valable !

ok ca je sais mais le prob c que je boucle dessus !

D'autre part, l'identificateur dans la structure header et le nom dans la structure directory ne sont pas des chaînes de caractères au sens C (c'est à dire terminées par un zéro binaire) mais de simples tableaux de caractères (sauf pour le nom s'il est plus court que 8 caractères puisqu'il est sensé être comblé avec des 0). L'affichage avec un %s ne fonctionne pas ! il faut %4.4s pour l'identificateur et %-8.8s pour le nom.

je vais regarder  ca ...
lundi 24 mars 2008 à 14:05:08 | Re : Wad File

jfrancois

La boucle continue au dela de numLumps itérations ? ou il y en a beaucoup !

Jean-François

lundi 24 mars 2008 à 14:16:13 | Re : Wad File

jfrancois

Je viens de télécharger un fichier HERETIC.WAD (j'imagine que ça ne doit pas manquer de versions différentes) et je vois :

Identification WAD             : PWAD
Nombre de lumps                : 3090
Pointeur vers le 1er directory : 15670376

Lump 1
Pointeur vers fichier   : 0
Taille en bytes du lump : 0
Nom du directory        : MAP01

Lump 2
Pointeur vers fichier   : 32
Taille en bytes du lump : 1750
Nom du directory        : THINGS

Lump 3
Pointeur vers fichier   : 1784
Taille en bytes du lump : 6020
Nom du directory        : LINEDEFS

Lump 4
Pointeur vers fichier   : 7804
Taille en bytes du lump : 18690
Nom du directory        : SIDEDEFS

Lump 5
Pointeur vers fichier   : 26496
Taille en bytes du lump : 1792
Nom du directory        : VERTEXES

Lump 6
Pointeur vers fichier   : 28288
Taille en bytes du lump : 8904
Nom du directory        : SEGS

Lump 7
Pointeur vers fichier   : 37192
Taille en bytes du lump : 1044
Nom du directory        : SSECTORS

Lump 8
Pointeur vers fichier   : 38236
Taille en bytes du lump : 7280
Nom du directory        : NODES

Lump 9
Pointeur vers fichier   : 45516
Taille en bytes du lump : 2288
Nom du directory        : SECTORS

Lump 10
Pointeur vers fichier   : 47804
Taille en bytes du lump : 968
Nom du directory        : REJECT

Lump 11
Pointeur vers fichier   : 48772
Taille en bytes du lump : 6242
Nom du directory        : BLOCKMAP

Lump 12
Pointeur vers fichier   : 55016
Taille en bytes du lump : 9841
Nom du directory        : DSMNPAIN

Lump 13
Pointeur vers fichier   : 64860
Taille en bytes du lump : 28
Nom du directory        : DSDMPAIN

Lump 14
Pointeur vers fichier   : 64888
Taille en bytes du lump : 10752
Nom du directory        : PLAYPAL

Lump 15
Pointeur vers fichier   : 75640
Taille en bytes du lump : 8704
Nom du directory        : COLORMAP

Lump 16
Pointeur vers fichier   : 84344
Taille en bytes du lump : 4000
Nom du directory        : ENDOOM

...

Lump 3090
Pointeur vers fichier   : 88344
Taille en bytes du lump : 4010
Nom du directory        : ENDOOM

Jean-François

lundi 24 mars 2008 à 14:29:35 | Re : Wad File

Nicolas___

sur moi c aussi un PWAD mais j'ai que "2415 lumps"

tu l'as lu comment ton WAD ?


lundi 24 mars 2008 à 14:47:42 | Re : Wad File

jfrancois

Réponse acceptée !

Je l'ai lu avec ton programme (simplifié) et des explications trouvées ici : [ Lien ]

Ce qui donne :

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


// --- Description du "header" d'un fichier WAD
struct HEADER
{
   char acIdentifier[4];
// !!! 0 terminateur absent
   long lLumpNumber;
   long lDirectoryOffset;
} Header;


// --- Description d'un "lump" dans le "directory" d'un fichier WAD
struct LUMP
{
   long lFilePos;
   long lSize;
   char acName[8]; // !!! 0 terminateur facultatif
} Lump;


int main()
{
   // --- Ouvrir le fichier WAD
   FILE *pFile = fopen("Heretic.WAD","r");
   if (pFile == NULL)
   {
      printf("*** Erreur à l'ouverture du fichier WAD ***\n");
      return EXIT_FAILURE;
   }
     
   // --- Lire le "header" du fichier WAD
   fread(&Header,sizeof(HEADER),1,pFile);
   printf("Identification WAD    : %4.4s\n",Header.acIdentifier);
   printf("Nombre de 'lumps'     : %ld\n"  ,Header.lLumpNumber);
   printf("Offset du 'directory' : %ld\n"  ,Header.lDirectoryOffset);
   getch(); // pause !
    
 

   // --- Lire le "directory" (= ensemble de "lumps")
   fseek(pFile,Header.lDirectoryOffset,SEEK_SET);
   for (int i=0 ; i<Header.lLumpNumber ; ++i)
   {
      printf("\nLump %d\n",i + 1);  
      fread(&Lump,sizeof(LUMP),1,pFile);
      printf("Position du fichier : %ld\n"       ,Lump.lFilePos);
      printf("Taille du 'lump'    : %ld octets\n",Lump.lSize);
      printf("Nom du 'lump'       : %-8.8s\n"    ,Lump.acName);
      //getch(); // pause !
   }
 

   // --- Fermer le fichier WAD et quitter
   fclose(pFile);
   return EXIT_SUCCESS;
}

Jean-François


1 2

Cette discussion est classée dans : int, file, printf, header, directory


Répondre à ce message

Sujets en rapport avec ce message

Hachage fermé problème de lecture [ par mcflysupersonic ] Bonjour je suis nouveau sur le forum est ceci est ma première question donc j'espère que je ne me suis pas trompé d'endroit pour poster.Voilà j'ai un Ouvrir et afficher un fichier texte en C [ par AsM0DeUz ] 'lut Je m'initie actuellement au C. Apres avoir fait les exos les plus basiques ... je passe au basique niveau 2 J'ai ecris qques lignes pour afficher Sélection d'octet [ par dayvid75014 ] Bonjour à tous, Je récupère les octets de mon fichier vidéo dans un buffer "Buffer[]" et je voudrais sélectionner les octets 0x47 et je n'y a Interpolation de Lagrange [ par highvoltage ] Bonjour à tous,je viens solliciter votre aide à propos d'un programme que j'ai a réalisé pour un projet. Je vous passe les détails, c'est la première Problème d'Affichage [ par temac ] Bonjour,j'ai un petit problème. J'ai un code où il y a trois options en fonctions de l'argument choisi. De façon indépendante elles marchent mais une Langage C : Puissance 4 [ par breakeur59150 ] Bonjour à tous,j'ai une ou deux question à vous poser, je suis en train de faire le jeu puissance 4 en langage c sous borland C, C'est un projet que l Equation du 3éme degrée [ par jeanphilippe37 ] Slt, je t'envoie le programme de maths, ms j'ai essayé de mettre un system(pause) ms cela me fou une erreur de compilation. Pourré-tu me dire random et printf avec for :( [ par sokotanic ] salutj'ai besoin d'aide#include #include #include //Abdou chez les Almohadesusing namespace std;int main(){    srand(time(NULL));int j,i;i probleme affichage structure [ par lil_adriano ] Slt tous le monde j'ai un souci avec l'affichage de mes structures. je dois faire la gestion d'une pizzeria.j'ai cree les structure et quelques proced PROBLEME GESTION DE FILE !!!!!!!!! [ par POWERC85 ] Bonjour à tous, Voilà je suis débutant en langage C et j'ai un travail à faire sur les Files... On me demande de faire : 1 fonction qui permet d'ajout


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,248 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales