Découpage de texte

cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006 - 28 déc. 2004 à 20:41
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006 - 29 déc. 2004 à 14:09
Bonsoir , encore une question à la mord moi le noeux.

J'ai un text du style :

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
ccccc
dddddddddddddddddddddddddddddddddddddddd

Je voudrai obtenir : (limiter l'espace vertical à 20,
c'est à dire que si une chaine depasse 20 caracteres le reste descend d'une ligne)
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
ccccc
dddddddddddddddddddd
dddddddddddddddddddd

J'ai essayé strtok pour separer les ligne avec delimsLine[] = "\n"; et ensuite separer les mots delimsMots[] = " " , le programme marche mais est tres aleatoire sachant strtok remplace les separateurs par des NULL.

Voilà , si quelqu'un a une idée , je planche dessus depuis quelques temps deja.

Merci

13 réponses

xboxut Messages postés 172 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 27 novembre 2009 1
28 déc. 2004 à 21:13
bon si tu veux je peux te passer ma fonction et tu te debrouille avec.
c une fonction pour limiter des lignes en les coupants.

bon ma fonction est un peu imposante et elle se trouve dans une classe alors je t explique comment je fais.

je charge un texte dans une chaine de caractere.
je calcule le nb max de carateres.
apres je parcour la chaine et je compte le nombre de caratere .a chaque fois qu une ligne(nb de caractere max ou \n) est passer j increment une variable nombre de ligne.je retourne en arriere pour me placer sur un espace pour pas couper des mot o cas ou je couperai sur un mot.

apres je cree un tablo 2d dyna de charactere de type char tablo[nbdeligne][nbdecharactere max]
je creer un tablo 1D de nb ou je range la taille de chaque ligne.
enfin je remplis les tablo 2d par les ligne grace nombre de char dans chaque ligne.

voila la fonction bon c ptetre un peu degueu desole c une partie de mon gui que j ai fait pour mon tpe:

j ai rajouter la declaration de classe pour que tu regarde quel membre est dedans


class ggstextboxsafe:public widget
{
public:
    short X,Y,H,W;//coordonnes de la textbox
unsigned int linetodraw;//nbdeligne a afficher
unsigned int linelenght;//taille de la ligne en charactere
short linestart;//ligne ou commencer l affichage.
    char *texte;//chaine de charactere initiale
char **buffertexttransform;//chaine de charactere coupe avec les tokens " " "."
short bufferlinenb;//nombre de ligne dans le buffer
char **buffertextfit;//buffer a afficher avec decoupage des chaine en fonction la place des fenetres
widget *parent;
short  taillesave;
    char espacement;
  
char handle;
short ymouse;//variable pour le parcour d une textbox
int backgroundcolor;
int textcolor;
int barcolor;
int scrollercolor;
 CALLBCK redrawprocess();
 CALLBCK ggswidgetcallbck();
 CALLBCK ggsmouseproc();
 short counter;
//void  getcoord(int x,int y,int x1,int y1);
ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,char cespacement=9);
ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,int cbackgroundcolor,int ctextcolor,int cbarcolor,int cscrollercolor,char cespacement=9);

~ggstextboxsafe();
};       

ggstextboxsafe::ggstextboxsafe(const char *inputtext,short xcoord,short ycoord,short w,short h,widget *gparent,int cbackgroundcolor,int ctextcolor,int cbarcolor,int cscrollercolor,char cespacement)
{
bool exception=false;//booleen pour gerer les exceptions o cas ou les chaine sont impossibles a couper

 this->backgroundcolor=cbackgroundcolor;
taillesave=0;
barcolor=cbarcolor;
textcolor=ctextcolor;
scrollercolor=cscrollercolor;
this->ymouse=0;
this->espacement=cespacement;
this->handle=0;
this->parent=gparent;
this->parent->addwidget(this);
short charcounter=0;
texte=new char[strlen(inputtext)+1];//creation d une chaine de taille inputtext
strcpy(texte,inputtext );//copi de la chaine inputtext dans la chaine cree
X=xcoord;//copie des coordonnees
Y=ycoord;
W=w;
H=h;
this->linetodraw=float(H-16)/this->espacement;
bufferlinenb=0;
linelenght=float(strlen(texte))/(text_length(font,this->texte)/float(W-16)+1);//calcul de la taille moyenne d une ligne.
    char *ptr=texte;//mise en place de pointeur sur la premier charactere de la chaine.
bufferlinenb=0;//utilisation de cette variable pour compter les chaine crees
ptr=texte;//mise en place de pointeur sur la premier charactere de la chaine.
charcounter=0;
while (*ptr!='\0')//creation de chaine de charactere de la taille des ligne tokenisees
{
        charcounter++;//ajout de un dans le compteur de charactere
if (charcounter>=linelenght)//si le compteur de charactere et plus gran ou egal au nb de charactere par ligne
{
if(*ptr=='.' || *ptr=='!' || *ptr==' ' || *ptr=='?')//on test si il y a des token apres lequel on peut couper
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];

bufferlinenb++;

charcounter=0;

}
else//sinon on repart en arriere pour trouver un espace dans lequel couper.
{
while(*ptr!=' ' && *ptr!='.'  && *ptr!='?' && exception!= true)
{
ptr--;
charcounter--;
if(charcounter<=0){charcounter=linelenght;ptr=ptr+linelenght;exception=true;}
}
ptr++;
//buffertexttransform[bufferlinenb]=new char[charcounter+1];

bufferlinenb++;
charcounter=1;

}
}
if(*ptr=='\n')
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];

bufferlinenb++;
charcounter=0;
}

ptr++;

     
}
if(charcounter!=0)
{
//	buffertexttransform[bufferlinenb]=new char[charcounter+1];

bufferlinenb++;
charcounter=0;
}//fin du comptage de ligne....
exception=false;
//buffertexttransform=new char*[bufferlinenb+1];//creationd un tableau de pointeur pour les lignes avec 1 en plus o cas ou char counter n est pas vide lorsque l on rencontre NULL
//for (int i=0;i=linelenght)//si le compteur de charactere et plus gran ou egal au nb de charactere par ligne
{
if(*ptr=='.' || *ptr=='!' || *ptr==' ' || *ptr=='?')//on test si il y a des token apres lequel on peut couper
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;

charcounter=0;

}
else//sinon on repart en arriere pour trouver un espace dans lequel couper.
{
while(*ptr!=' ' && *ptr!='.'  && *ptr!='?' && exception!= true)
{
ptr--;
charcounter--;
if(charcounter<=0){charcounter=linelenght;ptr=ptr+linelenght;exception=true;}
}

ptr++;
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=1;

}
}
if(*ptr=='\n')
{
//buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=0;

}

ptr++;

     
}
if(charcounter!=0)
{
//	buffertexttransform[bufferlinenb]=new char[charcounter+1];
array[bufferlinenb]=charcounter;
bufferlinenb++;
charcounter=0;
}//fin de creation  de lignes....
buffertexttransform=new char*[bufferlinenb+1];//creationd un tableau de pointeur pour les lignes avec 1 en plus o cas ou char counter n est pas vide lorsque l on rencontre NULL
buffertextfit=new char*[bufferlinenb+1];
for (int i=0;i<bufferlinenb+1;i++){ buffertexttransform[i]=new char[linelenght+1]; buffertextfit[i]=new char[linelenght+1]; }
ptr=texte;//copie des ligne tokenise dans le tableau et ajout de NULL pour les terminer
unsigned int counter=0;
for (int t=0;t<bufferlinenb;t++)
{
for (int u=0;u<array[t];u++)
{
counter++;
buffertexttransform[t][u]=*ptr;
if(counter<strlen(inputtext)+1)ptr++;
if(buffertexttransform[t][u]=='\n')
buffertexttransform[t][u]='\0';
}
//	if(buffertexttransform[t][u]=='\n')
//		buffertexttransform[t][u]='\0';
 buffertexttransform[t][u]='\0';

}

for ( int r=0;r<bufferlinenb;r++)//tranformation a effectuer si il s agit de text charge depuis fichier.
{
for (int f=0;f<linelenght;f++)
{

if(buffertexttransform[r][f]==13)buffertexttransform[r][f]='\0';
   
 

}

}
linestart=0;
}
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 déc. 2004 à 21:15
char machaine[] = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *c = machaine;
int i, NbrSaut = 0;

while (*c) {
for (i = 0; i < 20; ++i) {
if (!*c++) goto End;
}
*c++ = '\n';
NbrSaut++;
}
End:for (i 0; i < NbrSaut; ++i) *c++ 'a';
*c = 0;
+2(p - n)

Je t'explik le principe de ce ke j'ai fait (ya suremen mieux).
TU parcours ta chaine, tous les 20 caracteres, tu pose un '\n', pis arrivé a la fin de ta chaine, tu rajoutes les caracteres de ta chaine ke ta remplacé par des '\n'.
VOila

++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 déc. 2004 à 21:16
Oups, le '+2(p - n)' ne fait pas parti du code, dsl ;)

+2(p - n)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2004 à 21:56
AlexMAN> Ca marche que quand ya une unique lettre, je pense pas que ce soit tjrs le cas.
Je pense qu'il faudra mettre dans un autre tableau, copier 20 fois (au plus) puis mettre un '\n'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 déc. 2004 à 22:02
Dans skil a mis, ct ca, jme suis dit la mm chose, mais j'ai fait ce ki etait demandé moi !

+2(p - n)
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
28 déc. 2004 à 22:05
#include
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>

char FILEGetChar(int handle)
{
char c;
read(handle, &c, sizeof(char));
return c;
}
char* FILEGetString(int handle, int taille)
{
char *p, *str;
str=(char*)malloc((taille+1)*sizeof(char));
p=str;
do
{
*p=FILEGetChar(handle);
p++;
}while(*(p-1)!='\n' && *(p-1)!='\0' && (p-str)<taille)
*(p-1)='\0'//Fau voir si c'est pas *p j'ai pas compter
return strdup(str);
}

void main(void)
{
char *chaine,*buffer;
int file, len;
file=_open("test.txt", _O_RDWR);
chaine=(char*)calloc(2048,sizeof(char));
while(!_eof(file))
{
buffer=FILEGetString(file, 20);
buffer[20]='\0';
strcat(chaine, buffer);
strcat(chaine, "\n");
}
_close(file);
file=_open("test.txt", _O_TRUNC | _O_RDWR);
len=strlen(chaine);
_write(fle, chaine, len);
_close(file);
free(chaine);
}

Ca vous irait?

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2004 à 22:07
Je sais pas, voila ma solution si ca l'intéresse

  char machaine[] = "kjvhjkWcbn,sqbdfkhbW,xc ²,n;wxbcJKHdf cN";
  char manouvellechaine[64];
  char *c = machaine;
  char *d = manouvellechaine;
  int i, max = 10;

  while(1) 
  {
    for (i = 0; i < max; i++) 
    {
      *d++ = *c;
      if(!*c) 
        goto end;
      c++;
    }
    *d++ = '\n';
  }
end:
//...
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
28 déc. 2004 à 22:17
vecchio > non, tjrs pas, si la chaine a plus de 60 caracteres, ca foire...
Dans ma solution, ca foire aussi, je risk le buffer overflow...

+2(p - n)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
28 déc. 2004 à 22:24
Oui je sais, ca c'est a lui de savoir de combien il a besoin, éventuellement faire de l'allocation dynamique
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
29 déc. 2004 à 11:20
Désolé de m'être mal exprimer , en fait c'est du text comprehensible dont il faut pas couper le mot.

Une sorte de rezise d'un edit box , le nombre de caractere depend de la largueur de l'edit , et le mot n'est pas coupé.

si la ligne est limitée à 20 , et que le dernier mot depasse la limite il passe sur la ligne suivante ,ainsi de suite .

Merci de votre aide reactive.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
29 déc. 2004 à 11:22
PS:je fais du Win32
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 déc. 2004 à 13:27
Mais ton texte il apparaît ou? Si c'est dans un edit ou un static, tu n'as rien a faire, a condition de choisir les bon styles.
Mais tu aura un pb quand un mot sera plus llong que la longueur maximale autorisée.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
29 déc. 2004 à 14:09
Sur l'ecran , je n'ai pas le choix de la methode , il faut que je format le text dans un char.
0
Rejoignez-nous