Accueil > Forum > > > > Découpage de texte
Découpage de texte
mardi 28 décembre 2004 à 20:41:03 |
Découpage de texte

zame
|
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
|
|
mardi 28 décembre 2004 à 21:13:56 |
Re : Découpage de texte

xboxut
|
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<bufferlinenb+1;i++) buffertexttransform[i]=new char[linelenght+1]; short *array=new short[bufferlinenb+20];
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]; 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; }
|
|
|
mardi 28 décembre 2004 à 21:15:33 |
Re : Découpage de texte

AlexMAN
|
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
++
|
|
mardi 28 décembre 2004 à 21:16:57 |
Re : Découpage de texte

AlexMAN
|
Oups, le '+2(p - n)' ne fait pas parti du code, dsl ;)
+2(p - n)
|
|
mardi 28 décembre 2004 à 21:56:40 |
Re : Découpage de texte

vecchio56
|
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'
|
|
mardi 28 décembre 2004 à 22:02:46 |
Re : Découpage de texte

AlexMAN
|
Dans skil a mis, ct ca, jme suis dit la mm chose, mais j'ai fait ce ki etait demandé moi !
+2(p - n)
|
|
mardi 28 décembre 2004 à 22:05:14 |
Re : Découpage de texte

julienbj
|
#include <io.> #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 SavonVive le C Tchao Savon
|
|
mardi 28 décembre 2004 à 22:07:54 |
Re : Découpage de texte

vecchio56
|
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: //...
|
|
|
mardi 28 décembre 2004 à 22:17:59 |
Re : Découpage de texte

AlexMAN
|
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)
|
|
mardi 28 décembre 2004 à 22:24:06 |
Re : Découpage de texte

vecchio56
|
Oui je sais, ca c'est a lui de savoir de combien il a besoin, éventuellement faire de l'allocation dynamique
|
|
Cette discussion est classée dans : ligne, texte, découpage, bbbbbbbbbbbbbbbbbbbb, ccccc
Répondre à ce message
Sujets en rapport avec ce message
RichEdit Paint [ par crocejf2000 ]
Salut a tous,-->OS Win98, Borland C++ 5Je suis toujours avec mon compilateur maison, et j'ai un petit probleme d'affichage de ma RichEdit -> c'est pou
pb avec tableau et fichier texte [ par krolanta ]
Voila mon pb é que g un fichier texte avec des coordonnées et que je voudrais mettre chaque coordonnées ds une case du tableau.En fait ca revient a li
Lire un fichier Texte Ligne par ligne [ par Ricpperso ]
Bonjour,bon je fai un pti proget je voudrai savoir comment on fais pour lire un fichier Texte ligne par ligne, avec si possible le Cfile.merci d'avanc
Lire une ligne d'un fichier texte [ par CassusGreg ]
Salut à tous,Est-ce-qu'il existe une fonction pour lire une ligne de texte (terminé par 0x0D 0x0A) dans un fichier?Je suis sous VC++ 6merci
aller à la ligne dans un champ texte VC++ [ par Vaughn018 ]
Bonjour,après insertion d'un texte dans une ressource "edittext" qui a déjà certaines options activées (comme ES_MULTILINE), je ne vois jamais le text
A la ligne en EDITTEXT [ par gagah1 ]
Salut!Je voudrais écrire un texte en multiligne dans un control EDITTEXT (qui a un style ES_MULTILINE) comme exemple:-Michel-Bernard-BrigitteJ'ai mis
fichier texte [ par codavi ]
Bonjour, Voilà, je viens de décrouvrir ce forum et je souhaiterais que quelqu'un m'apporte un peu d'aide. Je veux pouvoir lire/ecrire dans un fichier
Recherche une ligne dans un fichier texte [ par kamelDEA ]
Bonjour,J'ai un fichier texte qui contient 100 ligne.chaque ligne est composée de 4 valeurs décimales (valeur de probabilité)J'arrive pas à touver la
control personalisé [ par kev03 ]
bonjour,je souhaite créer une sorte de tableau. Les elements de la première colonne sont chacun une serie de nom et ceux de la deuxieme colonne chacun
saut de ligne dans un fichier texte [ par milhandril ]
Je souhaite enregistrer des valeurs saisies dans une boite de dialogue dans un fichier texte, chaque champ est délimté par le caractère ";" et je souh
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|