Découpage de texte

Signaler
Messages postés
85
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
20 février 2006
-
Messages postés
85
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
20 février 2006
-
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

Messages postés
172
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
27 novembre 2009

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;
}
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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

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

+2(p - n)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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'
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Dans skil a mis, ct ca, jme suis dit la mm chose, mais j'ai fait ce ki etait demandé moi !

+2(p - n)
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
#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]
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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:
//...
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Oui je sais, ca c'est a lui de savoir de combien il a besoin, éventuellement faire de l'allocation dynamique
Messages postés
85
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
20 février 2006

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.
Messages postés
85
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
20 février 2006

PS:je fais du Win32
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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.
Messages postés
85
Date d'inscription
jeudi 27 mai 2004
Statut
Membre
Dernière intervention
20 février 2006

Sur l'ecran , je n'ai pas le choix de la methode , il faut que je format le text dans un char.