begin process at 2012 02 09 20:02:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

Découpage de texte


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Membre Club
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

Membre Club
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

Administrateur CodeS-SourceS
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

Membre Club
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
Savon

Vive le C
Tchao
Savon
mardi 28 décembre 2004 à 22:07:54 | Re : Découpage de texte

vecchio56

Administrateur CodeS-SourceS
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

Membre Club
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

Administrateur CodeS-SourceS
Oui je sais, ca c'est a lui de savoir de combien il a besoin, éventuellement faire de l'allocation dynamique

1 2

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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,749 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales