C pointeurs/Pointeurs de fichiers

Leçons de niveau 14
Une page de Wikiversité, la communauté pédagogique libre.
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
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.

Introduction[modifier | modifier le wikicode]

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 fichiers[modifier | modifier le wikicode]

Un fichier list.txt[modifier | modifier le wikicode]

  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 Gnuplot[modifier | modifier le wikicode]

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 Gnuplot[modifier | modifier le wikicode]

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ères[modifier | modifier le wikicode]

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 graphique[modifier | modifier le wikicode]

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 | modifier le wikicode]

  • 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 exemple[modifier | modifier le wikicode]

  • 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