Bonjour tous le monde,
J'ai voulu faire un programme qui consiste à faire la justication d'un texte, c'est à dire toutes les lignes du texte doivent avoir la même longueur à l'exception de la dernière ligne.
Bon, j'ai utilisé un fichier comme entrée pour lire mon texte. Puis j'ai fais une fonction qui permet d'éléminer les espaces inutiles : un seul espace entre deux mots, pas d'espaces avant la ponctuation, un espace après la ponctuation.
Après avoir éléminer les espaces j'ai fait une fonction qui prend en argument la longueur d'un ligne et j'ai fais une fonction de justification. Mais, j'ai un problème : quand je regarde l'exécution j'ai toujours un problème dans la première ligne de chaque paragraphe de mon texte, j'ai toujours un nombre de caractère inférieur à longueur d'une ligne. Par contre dans les autres lignes tout va bien.
Voilà mon code commenté, j'espère que vous pouvez m'aider :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE * Ouvrir_Fichier(char * nom_fichier)
{
FILE * f=fopen(nom_fichier,"r");
if (f==NULL)
return NULL;
else
return f;
}
int Lecture_Nombre_Caractere()
{
int nb;
printf("Donner le nombre de carcatere par ligne :\n");
scanf("%d",&nb);
return nb;
}
void Justifier_Fichier(FILE * f,int nb)
{
FILE * ftmp=fopen("c:/FichierJusitifie.txt","w");
int i;
char c;
while (!feof(f))
{
i=1;
while(i<=nb)
{
c=fgetc(f);
printf("%c",c);
fputc(c,ftmp);
i++;
}
if(i>nb)
{
c='\n';
printf("%c",c);
fputc(c,ftmp);
}
}
fclose(f);
fclose(ftmp);
}
// Fonction qui élémine les espaces du texte principale, après un signe de ponctuation on laisse uniquement
// 1 seul espace aussi entre chaines consécutives on laisse un seul espace.
void Effacer_Espace(FILE * f)
{
FILE * ftmp=fopen("c:/FichierSansEspace.txt","w");//C'est le fichier qui va contenir le texte après avoir effacé
char c; //les espaces inutiles.
int nb_space;
while(!feof(f))// Tanque on n'a pas atteint la fin du fichier on lit caractère par caractère
{
c=fgetc(f);
if ( (c!=' '))// si le caractère lu n'est pas un espace on vérifie s'il n'est pas une ponctuation
{
if ( (c!=',') && (c!='.'))//S'il n'est pas une ponctuation on ajoute le caractère lu au fichier
fputc(c,ftmp);//On l'insère dans le nouveau fichier crée au dessus
else
{
nb_space=0;//Sinon, il faut insérer uniquement un espace après la ponctuation
char tmp;
while((tmp=fgetc(f))==' ')//Cette boucle teste le nombre d'espace après la ponctuation
{
nb_space++;// Tanqu'on a un espace après la ponctuation on boucle
}
fputc(c,ftmp);// enfin on ajoute la ponctuation suivie d'un espace et le caractère suivant
fputc(' ',ftmp);
fputc(tmp,ftmp);
}
}
else // Si on a un espace c a d un espace entre deux mots, on doit laisser uniquement un seul espace
{
nb_space=1;
while((c=fgetc(f))==' ')
{
nb_space++;
}
if ( (c!=',') && (c!='.') )
{
fputc(' ',ftmp);
fputc(c,ftmp);
}
else
{
fputc(c,ftmp);// Ici on traite les espaces avant la virgule donc pas d'esapce avant la virgule ou
fputc(' ',ftmp);//un point
}
}
}
fclose(f);
fclose(ftmp);
}
int main(int argc, char *argv[])
{
FILE * fich1=Ouvrir_Fichier("c:/teste.txt");
FILE * fich2=NULL;
//FILE * f1;
int longueur;
if(fich1!=NULL)
{
printf("Elimination des espaces...\n");
Effacer_Espace(fich1);
//wait(5);
fich2=Ouvrir_Fichier("c:/FichierSansEspace.txt");
if(fich2!=NULL)
{
longueur=Lecture_Nombre_Caractere();
Justifier_Fichier(fich2,longueur);
}
}
else
printf("Veuillez verifier le nom du fichier ! \n");
//Justifier_Fichier(fich1,30);
system("PAUSE");
return 0;
}