Les fichiers de données en série d'enregistrements


o La classe de base
o La classe des fichiers séquentiels
o La classe des fichiers factuels
o Fonctions
Une simulation peut exploiter, en entrée, un ou plusieurs fichiers de données constitués d'une série d'enregistrements dont chacun, au-delà du premier, est associé (explicitement ou non) à un instant postérieur à l'instant auquel est associé le précédent.

Ces fichiers sont de l'un des deux types suivants, correspondant à deux sous-classes de SerialDataFile :

Pour chaque fichier de données, le développeur doit donc créer une sous-classe de SequentialDataFile ou de FactualDataFile, et insérer dans le code du simulateur la création d'une instance de la sous-classe concernée

La classe SerialDataFile posséde comme attributs :

  1. un attribut qui spécifie les champs utiles de l'enregistrement, dans l'ordre de leur position sur la ligne. Ces champs sont de deux types : les champs de clé et les champs de données proprement dit. La valeur de cet attribut mpFieldTab (de type pFieldTab, voir page 'Constantes symboliques générales/Champ d'un enregistrement de fichier') est un tableau de couples type du champ-valeur du champ ;
  2. une spécification de format de lecture ; c'est l'attribut mFormat ;
  3. une fonction de lecture exploitant le format ci-dessus et affectant une valeur aux éléments de mpFieldTab.
  4. seulement pour la sous-classe FactualDataFile, une fonction de renvoi de date qui sait reconnaître l'instant associé à l'enregistrement parmi ses champs, et qui le renvoie.

En outre, SerialDataFile hérite de File un attribut (de nom mpFile) dont la valeur, attribuée par le moteur au moment de l'ouverture du fichier, est un pointeur sur une structure FILE de C.

Remarques :

Par exemple, pour la ligne de référence suivante…

     0 Ut = -1 Xtp1 = -0.501177 Vtp1 = -0.00117684

… les lignes suivantes sont correctement écrites :

     2   cUt = -1  Xtp1 = -0.507017   Vtp1 = -0.00349537
     300 Ut = -100 Xtp1 = -0.37       Vtp1 = -0.1968
     41  Ut = -1   Xtp1 = -0.6        Vtp1 = -0.005737

… alors que l'ensemble de lignes suivant ne l'est pas :

     1 Ut = -1 Xtp1 = -0.503522      = -0.00234488 (manque la chaîne "Vtp1")
     2 Ut = -1 Xtp1 = -0.507017 Vtp1   -0.00349537 (manque la chaîne "=")
       Ut = -1 Xtp1 = -0.517346 Vtp1 = -0.00570937 (manque le premier champ)


Exemple de réalisation et d'exploitation d'un fichier de données :

1) dans UserType.h

         // Symboles de classe des fichiers en série d'enregistrements.
enum App_FileId {F_TOBOGGAN = 11};

2) dans UserFile.h

// Fonction de lecture spécifique du fichier de données.
//
Toboggan_ReadNextEnrgt(SequentialDataFile*);
 
// Enumération de tous les champs d'un enregistrement. Les symboles
// sont arbitraires. Les valeurs entières (positives ou nulles)  
// correspondantes sont optionnelles.
// 
enum  F_Toboggan_Fields {
  COMMAND, POSITION, NUMLIGNE, VITESSE
};

3) dans UserFile.cc

 
#include "UserFile.h"
 
  void CreationFichierToboggan()
//---------------------------------------------------------------------------- 
// Fonction de création du fichier de données.
//----------------------------------------------------------------------------
{
	// création de l'instance
  SequentialDataFile* pF = 
    new SequentialDataFile(F_TOBOGGAN, READ);

	// création du tableau des attributs correspondant aux champs
	// respecter l'ordre des champs sur la ligne
  pF->AddField(NUMLIGNE, INT  );
  pF->AddField(COMMAND,  INT  );
  pF->AddField(VITESSE,  FLOAT);
  pF->AddField(POSITION, FLOAT);
 
	// affectation d'une fonction de lecture 
  pF->AssignReadNextEnrgtMethod(Toboggan_ReadNextEnrgt);

	// désignation du nom physique du fichier ; réalise l'ouverture 
  pF->AssignFullName("data_toboggan.txt");

	// affectation d'un format de lecture lu en paramètre
  pF->AssignFormat(GetStringParameterValue("f_toboggan", "format");
};
 
int Toboggan_ReadNextEnrgt(SequentialDataFile* pF) 
//----------------------------------------------------------------------------
// Fonction de lecture d'un enregistrement.
// Retourne : le nombre de champs lus ou 'EOF'
//----------------------------------------------------------------------------
{
  return fscanf(pF->GetPhysicalFile(),
           pF->GetFormat(), 
           &pF->mpFieldTab[NUMLIGNE]->mFieldValue.intValue,
           &pF->mpFieldTab[COMMAND] ->mFieldValue.intValue,
           &pF->mpFieldTab[VITESSE] ->mFieldValue.floatValue,
           &pF->mpFieldTab[POSITION]->mFieldValue.floatValue);
};

4) dans les fonctions utilisant les champs d'un enregistrement :

CreationFichierToboggan();
while(ReadNextEnrgt(F_TOBOGGAN) != EOF) {
  float MyValue = GetFloatFieldValue(F_TOBOGGAN, VITESSE));
  ...
}

This page was generated with the help of DOC++.