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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
| /* ===============================================================
Inclusions de fichiers d'en-tête de la bibliothèque standard */
#include <stdio.h> /* Fonctions d'entrées/sorties (fichiers etc.) */
#include <string.h> /* Fonctions sur les chaînes de caractères */
#include <stdlib.h> /* Principales fonctions de biblio standard. */
/* ========================
Structures de données */
struct param
{
int proc;
/* + données nécessaires pour la base de données */
char sessionid[21];
/* ... */
};
/* =========================
Fonctions du programme */
/* ------------------------------------------------
Fonction pour se connecter à la base de données.
Il n'y a rien dedans, puisque je ne sais pas comment on fait.
Paramètres:
sessionid : [out] ID de session. Le buffer doit faire 21 caractères exactement.
Retourne 0 si OK, -1 si erreur. */
int ConnexionBaseDonnees(char sessionid[21])
{
/* ICI, TU DOIS METTRE LE CODE EN Pro*C PERMETTANT DE SE CONNECTER À LA BASE
ET DE METTRE L'ID DE SESSION DANS sessionid.
JE NE PEUX PAS LE FAIRE, CAR JE NE CONNAIS PAS Pro*C */
return 0;
}
/* ---------------------------------------------------
Fonction pour se déconnecter de la base de données.
Il n'y a rien dedans, puisque je ne sais pas comment on fait.
Paramètres:
sessionid : [in] ID de session.
Retourne 0 si OK, -1 si erreur. */
int DeconnexionBaseDonnees(char sessionid[21])
{
/* ICI, TU DOIS METTRE LE CODE EN Pro*C PERMETTANT DE SE DECONNECTER DE LA BASE
GRACE AU sessionid DE LA STRUCTURE.
JE NE PEUX PAS LE FAIRE, CAR JE NE CONNAIS PAS Pro*C */
return 0;
}
/* --------------------------------------------------
Fonction pour envoyer la ligne en base de données.
Il n'y a rien dedans, puisque je ne sais pas comment on fait.
Paramètres:
ligne : [in] La ligne lue (c'est un pointeur const sur le premier caractère de la ligne)
num : [in] Numéro de ligne.
autre : [in] Paramètre utilisateur passé à LireFichier().
Retourne 0 si OK, -1 si erreur. */
int EnvoyerLigneEnBase(char const * ligne, int num, void * autre)
{
struct param *pParams = autre;
int proc = pParams->proc;
/* ICI, TU DOIS METTRE LE CODE EN Pro*C PERMETTANT D'INSERER LA LIGNE EN BASE
GRACE AU sessionid DE LA STRUCTURE.
JE NE PEUX PAS LE FAIRE, CAR JE NE CONNAIS PAS Pro*C */
return 0;
}
/* ----------------------------------------------------------------------------
Fonction pour lire sur le fichier ouvert.
La fonction lit chaque ligne du fichier pour son buffer de 90 caractères.
Ensuite, elle cherche le caractère de retour à la ligne dedans,
le supprime s'il est là (si les lignes sont bien limitées à 86 caractères,
il sera forcément là, sauf pour la dernière ligne) puis appelle
la fonction EnvoyerLigneEnBase() sur la ligne lue.
Paramètres:
pFichierIn : [in] Le fichier ouvert (c'est un FILE*, on n'a pas besoin de savoir ce qu'il y a dedans)
autre : [bypass] Paramètre à passer à EnvoyerLigneEnBase()
Retourne 0 si OK, -1 si erreur. */
int LireFichierOuvert(FILE *pFichierIn, void * autre)
{
/* Le tableau de 90 caractères: fgets() va y mettre la ligne lue du fichier. */
char bufLigne[90];
int numLigne = 1;
/* fgets() est la fonction standard de lecture d'une ligne dans un fichier ouvert.
Elle retourne NULL en cas d'erreur.
Si elle réussit à lire une ligne complet, le retour à la ligne (\n) sera dedans.
Si la ligne est trop grande pour le buffer, elle sera tronquée avant. */
while(fgets(bufLigne, 90, pFichierIn) != NULL)
{
/* Ici, buf contient une ligne terminée par un \n */
/* Recherche du \n pour le supprimer:
strchr() est la fonction standard de recherche d'un caractère dans une chaîne.
Elle prend un pointeur de chaîne de caractères et un caractère en paramètre.
Elle retourne l'adresse du caractère dans la chaîne, ou NULL si elle ne l'a pas trouvé. */
char * pLF = strchr(bufLigne, '\n');
/* Si on l'a trouvé, on le vire.
Sinon, c'est soit une erreur, soit la dernière ligne. */
if(pLF != NULL)
{
/* \n trouvé: Tronque la chaîne juste avant */
*pLF = '\0';
}
else if(strlen(bufLigne) == 90-1)
{
/* strlen() donne la longueur d'une chaîne de caractère (sans le caractère nul à la fin).
Si cette longueur est égale à la taille du buffer moins 1, c'est que le buffer est plein à ras bord. */
return -1; /* ERREUR: La ligne était trop longue. */
}
else
{
/* Pas de \n mais ligne pas trop longue:
Ce doit être la dernière. */
/* On ne fait rien ici. */
}
/* Traitement de la ligne */
if( EnvoyerLigneEnBase(bufLigne, numLigne, autre) < 0 )
return -1;
numLigne++;
}
return 0;
}
/* ----------------------------------------------------------------------------
Fonction pour ouvrir un fichier et le lire:
Cette fonction ouvre le fichier dont on lui passe le nom,
elle obtient alors un pointeur de fichier ouvert.
Alors elle appelle la fonciton LireFichierOuvert() sur ce pointeur.
Paramètres:
nomFich : [in] Nom du fichier à lire (c'est en fait un pointeur sur le premier caractère du nom)
autre : [bypass] Paramètre à passer à EnvoyerLigneEnBase()
Retourne 0 si OK, -1 si erreur. */
int LireFichier(char const *nomFich, void * autre)
{
/* Valeur qui sera retournée par la fonction.
Si l'ouverture échoue, elle restera à -1 (erreur). */
int ret = -1;
/* Variable qui contiendra le pointeur de fichier ouvert, retourné par fopen() */
FILE * pFichier = NULL;
/* fopen() est la fonction standard pour ouvrir un fichier.
Elle retourne un pointeur de fichier ouvert, ou NULL si l'ouverture échoue. */
pFichier = fopen(nomFich, "r");
if(pFichier != NULL)
{
/* Le pointeur n'est pas NULL, l'ouverture a donc réussi. */
/* puts() : Une fonction standard toute bète pour afficher un message. */
puts("Lecture du fichier...");
ret = LireFichierOuvert(pFichier, autre);
/* fclose() : Fonction pour fermer un fichier ouvert.
Il ne faut pas l'utiliser si le pointeur est NULL. */
fclose(pFichier);
}
else
{
/* Le pointeur est NULL, l'ouverture a échoué. */
puts("Echec d'ouverture.");
}
return ret;
}
int main(int argc, char * argv[])
{
struct param params;
char const * nomFichier = NULL;
long proc = 0;
/* Lire les paramètres. */
/* Paramètres: On va dire nom du fichier en premier paramètre, valeur de proc en second. */
if(argc < 3)
{
puts("Pas assez de paramètres.");
return 1;
}
nomFichier = argv[1];
proc = strtol(argv[2], NULL, 10);
/* Connexion à la base de données */
if( ConnexionBaseDonnees(params.sessionid) < 0)
{
puts("Echec de connexion");
return 1;
}
/* Traitement du fichier */
params.proc = (int)proc;
LireFichier(nomFichier, ¶ms);
/* Déconnexion de la base de sonnées. */
DeconnexionBaseDonnees(params.sessionid);
return 0;
} |