Outils d'impression langage C

Signaler
Messages postés
2
Date d'inscription
mercredi 12 décembre 2007
Statut
Membre
Dernière intervention
15 avril 2008
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,

Je suis désoler de vous imposer cette tache, mais qui peux mexpliquer ce code...
Car je dois en expliquer son intégralité pour un orale noté...Et c'est une explication plutot complete


qu'il me faut de façon a ce que je comprenne ce code et que je puisse par la suite le réexpliquer...
Je vous en remercie d'avance...

#include "appli.h"


void impression(char *MsgNomFichier)
{


 FILE *FP;
    int TextLen,iCpt;
 char LignePrint[100];
    int Index1 = 0;
    int Index2 = 2;
    int Exit = 0;


    PRINTDLG    pd;  //on creer un objet de type PRINTDLG, contient les informations de la structure PrintDlg
    DOCINFO     di;  //on creer un objet de type DOCINFO, contient les informations du noms du fichier...
 
    memset (&pd, 0, sizeof(PRINTDLG)); //Sets buffers to a specified character.
    memset (&di, 0, sizeof(DOCINFO));  //Sets buffers to a specified character.
 
    di.cbSize = sizeof(DOCINFO); //avoir la taille de la structure DOCINFO


 if(buffer.FlagError==1) di.lpszDocName = "Journal-Erreur(s)"; //donne un nom au document
 else di.lpszDocName = "Journal-Travaux"; //journal de la journée
   
    pd.lStructSize = sizeof(PRINTDLG);  //taille de la structure PRINTDLG
    pd.Flags = PD_PAGENUMS | PD_RETURNDC;
    pd.nFromPage = 1;  
//les informations pour la page nombre de page, page MAx, page Min.... ici on la met à 1
    pd.nToPage = 1;
    pd.nMinPage = 1;
    pd.nMaxPage = 10;
if( (FP=fopen(MsgNomFichier,"r")) == NULL )
 {
      FctSetEdit( "Impossible d'ouvrir le journal" );
 }


 for(iCpt=0,TextLen=0;;iCpt++,TextLen++)
 {
  Tbuff[iCpt]=fgetc(FP);  //on met dans Tbuff[iCpt] un caractère contenu dans le fichier
  if(feof(FP))//fin de fichier  and of file
  {
   Tbuff[iCpt]='\0'; //on met dans le buffer un caractère de fin de       fichier \0
   break;
  }
 }
 fclose(FP);//fermeture du fichier


 if (PrintDlg (&pd))
    {
        if (pd.hDC)
        {
  
            if (StartDoc (pd.hDC, &di) != SP_ERROR) //si different de SP_ERROR
            {
              if (TextLen) //contient la taille du fichier
              {
                if (TextLen > 0) //si la taille contenu dans le fichier est supérieur à 0
                {
                  for (iCpt=0;iCpt<TextLen;iCpt++)  //boucle for tant que iCpt<Textlen (taille du fichier)
                  {
                    LignePrint[Index1] = Tbuff[iCpt];  //on met dabs LignePrint ce qu'il y a dans Tbuff


                    if (Tbuff[iCpt] == '\n')
                    {
      Index2 ++;
      LignePrint[Index1] = '\0';
      TextOut (pd.hDC,100, Index2*100, LignePrint, strlen(LignePrint));
 /*le handle, coordonnée de départ de x, coordonnée de départ y, pointeur sur chaîne,et taille de ce qu'il y a dans le tableau LignePrint*/
      Index1 = 0;
                    }
      else
     {
      Index1 ++;
     }
     if (Index2 == 60)
                    {
  //indique que le system a finit de d'ecrire sur la page
      EndPage (pd.hDC);
  //fin de la fonction "fin d'impression du travail"
      EndDoc (pd.hDC);
      //impression du fichier
      StartDoc (pd.hDC, &di);
      Index2 = 2;
                    }
                  }
                  Index2 ++;
                  LignePrint[Index1] = '\0';
                  TextOut (pd.hDC,100, Index2*100, LignePrint, strlen(LignePrint));
                  EndPage (pd.hDC);
                  EndDoc (pd.hDC);
   //indique à l'operateur que l'impression est lancée
      MsgBox("Impression lancée");
                 }
                else MsgBox("Impossible d'imprimer\r\nLe document est vide");
              }
            }
            else MsgBox("ERREUR impression");
        }
        else MsgBox("ERREUR impression");
    }
    else MsgBox("Impression annulée par l'utilisateur");


}

1 réponse

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Voici le code ci-dessus reformaté (le code initial est très mal écrit et très mal structuré : il faut traiter les erreurs dès qu'elle se produisent ainsi on peut continuer le code en séquence plutôt que d'avoir cette invraisemblable cascade de "if/then/else" qui rend le code illisible) et commenté. Le bloc de lignes entre ///////////// au début est là pour permettre la compilation et le test (en mode console) de cette fonction "impression".

#include <stdio.h>



////////////////////////////////////////////////////////////
//#include "appli.h"
#include <windows.h>
struct { int FlagError; } buffer = {0};
char Tbuff[10000];
#define FctSetEdit(x) MessageBox(NULL,x,"FctSetEdit",MB_OK);
#define MsgBox(x)     MessageBox(NULL,x,"MsgBox",MB_OK);
////////////////////////////////////////////////////////////



void impression
(
   const char *MsgNomFichier // E:nom du fichier à imprimer
)
{
   // -------------------------------------
   // LIRE EN MÉMOIRE LE FICHIER À IMPRIMER
   // -------------------------------------




   // --- Ouvrir le fichier
   FILE* fp = fopen(MsgNomFichier,"r");
   if (fp == NULL)
   {
      FctSetEdit("Impossible d'ouvrir le journal");
      return;
   }




   // --- Lire le fichier (caractère par caractère !)
   int iTextLen = 0;
   while (true)
   {
      Tbuff[iTextLen] = fgetc(fp);
      if (feof(fp))
      {
         Tbuff[iTextLen] = 0; // terminateur
         break;
      }
      ++iTextLen;
   }




   // --- Fermer le fichier
   fclose(fp);




   // --- Quitter si le fichier est vide
   if (iTextLen == 0)
   {
      MsgBox("Impossible d'imprimer\nLe document est vide");
      return;
   }





   // ------------------------------------------------
   // DIALOGUE DE L'IMPRESSION (CHOIX DE L'IMPRIMANTE)
   // ------------------------------------------------




   // --- Structure de données de type "PRINTDLG"
   // --- contient les données d'initialisation de la fonction "PrintDlg"

   PRINTDLG pd;
   memset(&pd,0,sizeof(PRINTDLG)); // mise à zéro avant initialisation
   pd.lStructSize = sizeof(PRINTDLG);
   pd.Flags       = PD_PAGENUMS | PD_RETURNDC;
   pd.nFromPage   = 1;  
   pd.nToPage     = 1;
   pd.nMinPage    = 1;
   pd.nMaxPage    = 10;




   // --- Dialogue de l'impression
   if (PrintDlg(&pd) == FALSE)
   {
      MsgBox("Impression annulée par l'utilisateur");
      return;
   }
   if (pd.hDC == NULL)
   {
      MsgBox("ERREUR impression");
      return;
   }





   // --------------------
   // IMPRIMER LE DOCUMENT
   // --------------------




   // --- Structure de données de type "DOCINFO"
   // --- contient les données d'initialisation de la fonction "StartDoc"

   DOCINFO di;
   memset(&di,0,sizeof(DOCINFO)); // mise à zéro avant initialisation
   di.cbSize = sizeof(DOCINFO);
   if (buffer.FlagError == 1) // nom du document
      di.lpszDocName = "Journal-Erreur(s)";
   else
      di.lpszDocName = "Journal-Travaux";




   // --- Début du document
   if (StartDoc(pd.hDC,&di) == SP_ERROR)
   {
      MsgBox("ERREUR impression\nDébut du document");
      return;
   }




   // --- Imprimer le document page par page
   char LignePrint[100];
   int  iCaracteresParLigne = 0;
   int  iLignesParPage = 0;
   for (int iCpt=0 ; iCpt




      // --- Extraire et imprimer une ligne de texte
      // --- (une ligne doit avoir 99 caractères maxi !)
      LignePrint[iCaracteresParLigne] = Tbuff[iCpt];
      if ((LignePrint[iCaracteresParLigne] == '\n') || bDerniereLigne)
      {
         // --- Début de page
         if (iLignesParPage == 0) StartPage(pd.hDC);




         // --- Imprimer la ligne extraite
         ++iLignesParPage;
         LignePrint[iCaracteresParLigne] = 0; // terminateur
         TextOut
         (
             pd.hDC
            ,300                  // début de ligne en X (pixels imprimante)
            ,iLignesParPage * 100 // début de ligne en Y (pixels imprimante)
            ,LignePrint           // ligne à imprimer
            ,strlen(LignePrint)   // longueur de la ligne
         );
         iCaracteresParLigne = 0; // pour extraire la ligne suivante




         // --- Fin de page atteinte ?
         if (iLignesParPage == 58  ||  bDerniereLigne)
         {
            EndPage(pd.hDC);
            iLignesParPage = 0;
         }
         continue;
      }
      ++iCaracteresParLigne;
   }




   // --- Fin du document
   EndDoc(pd.hDC);
   MsgBox("Impression terminée");
}





void main()
{
   impression("Z:/Traces/Test1.log"); // fichier vide
   impression("Z:/Traces/Test2.log"); // fichier 1 ligne
   impression("Z:/Traces/Test3.log"); // fichier 80 lignes
}








Jean-François