C pointeurs/Pointeurs de fichiers

Début de la boite de navigation du chapitre
Pointeurs de fichiers
Icône de la faculté
Chapitre no 1
Leçon : C pointeurs
Retour auSommaire
Chap. suiv. :Pointeurs de fonctions
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « C pointeurs : Pointeurs de fichiers
C pointeurs/Pointeurs de fichiers
 », n'a pu être restituée correctement ci-dessus.

IntroductionModifier

Quelques fonctions à connaitre :

f_p=fopen("a.txt","w");//(write)  Créer un fichier en écriture.
f_p=fopen("a.txt","r");//(read)   0uvrir un fichier en lecture.
f_p=fopen("a.txt","a");//(append) 0uvrir un fichier en écriture. 
                       //         Rajouter le texte en fin de fichier.

 printf(    "%d",i);   // Imprimer sur l'écran.
fprintf(f_p,"%d",i);   // Imprimer dans le fichier *f_p
sprintf(  s,"%d",i);   // Imprimer dans la chaine de caractères s.
  • Éviter les lettres accentuées dans les fichiers sources (*.c,*.h).
  • Cela pose des problèmes pour échanger les fichiers entre Windows et Linux ou à l'international.

Premiers fichiersModifier

Un fichier list.txtModifier

  1. Copier cet exemple dans votre éditeur.
  2. Sauvez-le sous le nom "c01.c"
  3. Compilez et exécutez-le.
  4. Éditer le fichier "list.txt"
/* ------------------------------ */
/* Save as c01.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE   *fp;                   /*Déclarer un pointeur de fichier.   */
double   a;
                              /*Ouvrir le fichier en mode écriture.*/
 fp = fopen("list.txt","w");  /*fp est un pointeur de fichier      */
                              /*qui pointe sur "list.txt"          */
 for(a = -5.0; a <= 5.0; a++)
  fprintf(fp," %6.3f %6.3f\n",/*Imprimer dans le fichier           */
                a,   f(a));
 fclose(fp);                  /*Fermer le fichier                  */

 printf("\n\n Ouvrir le fichier list.txt "
        "\n\n Press return to continue.  ");
 getchar();
 return 0;}

Un fichier de données pour GnuplotModifier

Nous ne mettrons pas d'extension pour les fichiers de données avec Gnuplot.

  1. Compilez et exécutez-ce fichier.
  2. Éditer le fichier "data"
  3. Dans Gnuplot. tapez : plot "data"
/* ------------------------------ */
/* Save as c02.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(pow(x,2.));}
/* ------------------------------ */
int main(void)
{
FILE *fp = fopen("data","w");
double a = -5.0;

  for(; a <= 5.0; a+=.2)
     fprintf(fp," %6.3f   %6.3f\n",a,f(a));
  fclose(fp);

 printf(" Dans gnuplot -> plot \"data\" \n\n"
        " Press return to continue.     \n\n");
 getchar();

 return 0;
}

Un fichier de commande pour GnuplotModifier

L'extension des fichiers de commande de gnuplot est "*.plt" Ici on dessine deux chaines de caractères.

  1. Compilez et exécutez-ce fichier.
  2. Éditer le fichier "a_main.plt"
  3. Dans Gnuplot tapez : load "a_main.plt"
/* ------------------------------ */
/* Save as c03.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
char  heq[] = "sin(x)";
char  geq[] = "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE   *fp = fopen("a_main.plt","w");

fprintf(fp,"# Fichier de commande pour Gnuplot          \n"
           "# En ligne de commande : load \"a_main.plt\"\n"
           "#\n"
           " set zeroaxis\n"
           " plot %s,\\\n"
           " %s \n\n"
           " reset", geq, heq);
 fclose(fp);

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour Gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
  set zeroaxis
  plot cos(x),\
  sin(x) 
  reset

On peut remarquer que chaque fonction est sur une ligne différente. Important si l’on veut dessiner quatre ou cinq fonctions.

Dessiner une liste et une chaîne de caractèresModifier

On associe les deux méthodes vues précédemment.

  1. Compilez et exécutez-ce fichier.
  2. Éditer le fichier "a_main.plt"
  3. Dans Gnuplot tapez : load "a_main.plt"
/* ------------------------------ */
/* Save as c04.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
/* ------------------------------ */
char   feq[] =           "cos(x)";
/* ------------------------------ */
int main(void)
{
FILE *fp;
double a = -5.0;

   fp = fopen("data","w");
   for(; a <= 5.0; a+=.2)
        fprintf(fp," %6.3f   %6.3f\n",   a, f(a));
   fclose(fp);

   fp = fopen("a_main.plt","w");
   fprintf(fp,"# Fichier de commande pour Gnuplot          \n"
              "# En ligne de commande : load \"a_main.plt\"\n"
              "#\n"
              " set zeroaxis\n"
              " plot \"data\",\\\n"
              " %s\n"
              " reset",feq);
   fclose(fp);

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour Gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
 set zeroaxis
 plot "data",\
 cos(x)
 reset

Une fonction graphiqueModifier

On met simplement le contenu de la fonction main() dans G_plot().

  1. Compilez et exécutez-ce fichier..
  2. Éditer le fichier "a_main.plt"
  3. Dans Gnuplot tapez : load "a_main.plt"
//* ------------------------------ */
/* Save as c05.c                  */
/* ------------------------------ */
#include    <stdio.h>
#include     <math.h>
/* ------------------------------ */
double f(double x){return(cos(x));}
char   feq[] = "cos(x)";
/* ------------------------------ */
int G_plot(void)
{
FILE *fp;
double a = -5.0;

   fp = fopen("data","w");
   for(; a <= 5.0; a+=.2)
        fprintf(fp," %6.3f   %6.3f\n",a,f(a));
  fclose(fp);

  fp = fopen("a_main.plt","w");
   fprintf(fp,"# Fichier de commande pour Gnuplot          \n"
              "# En ligne de commande : load \"a_main.plt\"\n"
              "#\n"
              " set zeroaxis\n"
              " plot \"data\",\\\n"
              " %s\n"
              " reset",feq);
  fclose(fp);

return 0;
}
/* ------------------------------ */
int main(void)
{
 G_plot();

 printf("\n\n load \"a_main.plt\" with gnuplot."
        "\n\n Press return to continue.        ");
 getchar();

 return 0;
}

Cela donne dans le fichier "a_main.plt" :

 # Fichier de commande pour Gnuplot          
 # En ligne de commande : load "a_main.plt"
 #
 set zeroaxis
 plot "data",\
 cos(x)
 reset

Génération de code C automatiséModifier

  • Voici un type de code qui peut-être créer par une boucle for(:); et copier dans un fichier.
    P0.x * pow((1-t),3) * pow(t,0) +
3 * P1.x * pow((1-t),2) * pow(t,1) +
3 * P2.x * pow((1-t),1) * pow(t,2) +
    P3.x * pow((1-t),0) * pow(t,3)
  • Il suffit ensuite de le copier dans le fichier c.

Un exempleModifier

  • La création de polynômes pour les courbes de Bézier
    • Ce travail est trop complexe pour être abordé ici.
    • Vous pouvez le voir dans cette vidéo.
    • Vous pouvez retrouver les fichiers correspondant ici : fichiers.
    • Pour une initiation aux courbes de Bézier c’est ici : Courbes_de_béziers