xxDarkSidexx
Messages postés2Date d'inscriptionmercredi 12 décembre 2007StatutMembreDernière intervention15 avril 2008
-
15 avril 2008 à 10:44
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 2009
-
15 avril 2008 à 14:07
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");
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 15 avril 2008 à 14:07
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".
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
}