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
| // Inclusions des fichiers d'en-tete
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
// Taille du buffer lors du parcours du fichier
#define TAILLE_LIGNE 200
// Prototypes des fonctions
void usage(void);
int stail(const char* nomFichier, const unsigned int nbr);
// Programme
int main (int argc, const char * argv[])
{
// Declarations des variables
int codeRetour=1;
unsigned int nbr = 0;
// Recuperation des arguments et affichage avec stail() si OK
if(3!=argc)
{
puts("Nombre d'arguments invalides");
usage();
codeRetour = EXIT_FAILURE;
}
else
{
//nbr = atoi(argv[2]);
// Verification que le dernier argument est un nombre
char *erreurConv;
nbr = (unsigned int) strtoul(argv[2], &erreurConv, 10);
if (*erreurConv != '\0')
{
puts("Le dernier argument doit etre un nombre entier");
usage();
codeRetour = EXIT_FAILURE;
}
else
{
codeRetour = stail(argv[1], nbr);
}
}
//Fin du programme
return codeRetour;
}//main
void usage(void)
{
puts("--------------------------------------------------------");
puts("La commande stail affiche la fin d'un fichier");
puts("stail prend deux arguments en parametres");
puts("\t- Le premier est le nom du fichier a afficher");
puts("\t- Le second est le nombre de lignes a afficher");
puts("--------------------------------------------------------");
}//usage
int stail(const char* nomFichier, const unsigned int nbr)
{
int nbAffichees = nbr;
// Indice de parcours
int i=0;
// Indicateur d'erreur lors du parcours du fichier / sert aussi de code retour
int doNotDisplay=0;
// Tampon des positions de debut de lignes
int *t_positions = malloc(sizeof(int)*100);
// Nombre de lignes dans le fichier
int nbLignes = 0;
// Tampon de la ligne courante
char *t_ligne = malloc(sizeof(char)*TAILLE_LIGNE);
FILE *pt_fic = fopen(nomFichier, "r");
if(NULL==pt_fic)
{
printf("Impossible d'ouvrir le fichier %s : (%d) %s\n", nomFichier, errno, strerror(errno));
// On positionne le code retour
doNotDisplay=1;
}
else
{
// La premiere ligne commence maintenant
*(t_positions+i)=ftell(pt_fic);
if(1L==*(t_positions+i))
{
perror("Erreur lors de la lecture");
doNotDisplay=1;
}
i+=1;
// Flag de lecture
int keepReading=1;
// Boucler sur le fichier pour determiner les positions des debuts de lignes
while( 1 == keepReading )
{
// Lecture d'une nouvelle ligne
t_ligne = fgets(t_ligne, TAILLE_LIGNE, pt_fic);
// On continue a lire ?
if(t_ligne==NULL)
{
// Stopper la lecture
keepReading=0;
// On determine la cause de l'erreur
if(0 != feof(pt_fic))
{
// Fin du fichier atteinte
//puts("Fichier parcouru avec succes");
}
else
{
// Autre erreur
perror("Erreur lors de la lecture");
// On n'affichera pas le fichier
doNotDisplay=1;
}
}
else
{
// Ligne lu en entier ou buffer trop petit ?
if(NULL==strrchr(t_ligne, '\n'))
{
//DEBUG
//printf("(%dd)%s", i, t_ligne);
// Buffer trop petit pour contenir la ligne entiere : on continue a lire sans memoriser la position
}
else
{
//DEBUG
//printf("(%d) %s", i, t_ligne);
// Memorisation de la position
*(t_positions+i)=ftell(pt_fic);
if(1L==*(t_positions+i))
{
perror("Erreur lors de la lecture");
doNotDisplay=1;
}
i+=1;
}
}
}//while
// --------------------------------------------------------------------------------------------
// Affichage a la facon de tail si pas d'erreur lors du parcours
if (1!=doNotDisplay)
{
// Tampon de lecture
char carac=0;
// Nombre de lignes
nbLignes = i-1;
//printf("\n\nOn finit de lire le fichier. Il y a %d lignes.\nOn va maintenant afficher la fin du fichier, soit les %d dernieres lignes.\n\n", nbLignes, nbAffichees);
// Enlever le flag de fin de fichier
clearerr(pt_fic);
// Se positionner au bon endroit
if(nbLignes>nbAffichees)
{
fseek(pt_fic, *(t_positions+nbLignes-nbAffichees), SEEK_SET);
}
else
{
fseek(pt_fic, *(t_positions), SEEK_SET);
}
// Affichage
while ( EOF!=(carac=fgetc(pt_fic)) )
{
putchar(carac);
}
}
// Fermeture du fichier
fclose(pt_fic);
}//Ouverture du fichier
return doNotDisplay;
}//stail |
Partager