OVH Cloud OVH Cloud

traitement du fichier

38 réponses
Avatar
programmation
Salut,

J'ai un fichier texte bien form=E9 contient deux champs: objet et
attribut.
tous les objets sont des entiers et tous les attributs sont de chaines
de caract=E8res de m=EAme taille.
chaque ligne contient un objet et son attribut par exemple:

essai.txt:

1 11100

2 10101

3 01001

4 10001


Je voudrais supprimer les 0 de m=EAme position dans chaque chaine de
caract=E8re.
Par exemple dans notre cas, nous allons supprimer les 0 dans la
position 4 de chaque chaine car dans cette position nous avons toutes
les chaines sont =E0 0.

le r=E9sultat est :


1 1110

2 1011

3 0101

4 1001

j'ai trouv=E9 une difficult=E9 de r=E9soudre ce probl=E8me, de plus imagine=
z
si nous avons un fichier volumineux.

SVP, j'ai besoin de vos aides.

8 réponses

1 2 3 4
Avatar
programmation
On 23 juil, 00:51, Christian ASTOR wrote:
programmation wrote:
> Je voudrais afficher les positions qui contiennent le caractère 0 dan s
> le deuxième champ attribut du fichier.

Je ne comprends pas : tu les as les positions, par exemple quand tu fais
ta fonction pour compter les "1", tu scannes bien ta chaîne et testes s i
chaque caractère (donc position dans la chaîne) est == '1' ...




Salut,

- La fonction compte permet de compter les 1 pour chaque deuxième
champ dans le fichier après le tri.
Mais, moi je cherche les positions communes des colonnes que vous avez
supprimées.

Si je vais appliquer la fonction compte sur le fichier non trié
suivant:
1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

Voici la fonction qui compte les "1" où j'ai ajouté un tableau
dynamique pour stoker les positions des colonnes supprimées:

int compte(ch)
char ch[32];
{
int *tabPos;
int i,p=0,k=0,m;
tabPos = (int *) malloc(tabPos * sizeof(int));
for(i=0; i < strlen(ch) ; i++)
{

if (ch[i] == '1')

k=k+1;

else
{
tabPos[p]=ch[i];
p++;
}

}

// afficher le contenu du tableau
for(m=0;m<p;m++)
printf("%c : ",tabPos[m]);

// libérer le tableau
free(tabPos);

return (k);

}


- Après la compilation, j'ai ce message d'erreur :

error : invalid operands to binary *

cet erreur porte sur l'instruction suivant : tabPos = (int *) malloc
(tabPos * sizeof(int));

comment je vais corriger cet erreur ?

- J'ai remarqué que on stocke à chaque fois les positions de caractèr e
"0" de deuxième champ (chaine caractère) du chaque ligne du fichier
dans un tableau dynamique.
à chaque deuxième champ de chaque ligne du fichier, on aura un tableau
des positions 0. Mais, ce tableau il sera effacer dans l'itération
suivant car on travaille sur le même tableau.
C'est juste ou non ?

par exemple, pour la première ligne :
1 110101 on aura un tableau qui contient les positions 2 et 4
2 100101 on aura un tableau qui contient les positions 1,2 et 4.
etc


- Mais le résultat souhaité est d'obtenir un tableau (ou fichier) qui
contient les positions 2 et 4 dans notre exemple.
je ne sais pas le mieux d'utiliser un tableau ou un fichier pour
stocker les positions 2 et 4 car je vais parcourir ce tableau ou ce
fichier pour utiliser après dans mon programme ?

- Vous avez supprimé des lignes vides et des colonnes vides dans votre
programme.
Pouvez - vous savoir et afficher les positions communes des "0" pour
chaque deuxième champ de chaque ligne du fichier ?
Où vous allez faire une modification dans votre programme pour faire
ceci ?

Merci.
Avatar
Christian ASTOR
programmation wrote:

Mais, moi je cherche les positions communes des colonnes que vous avez
supprimées.



C'est donc dans le tableau nColumn[]
Avatar
programmation
On 23 juil, 11:59, Christian ASTOR wrote:
programmation wrote:
> Mais, moi je cherche les positions communes des colonnes que vous avez
> supprimées.

C'est donc dans le tableau nColumn[]



Salut,

Lorsque j'ajoute le code suivant à votre programme pour afficher le
contenu du tableau nColumn[]:

for (j = 0; j<nCpt; j++) // j : indice de tableau et nCpt la taille
de tableau nColumn[]:
printf("%d :%dn",j,nColumn[j]); // nColumn[j] le
contenu de tableau nColumn[]: dans la position j


J'obtiens :
0 : 0
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 0
7 : 0


Voici le contenu du fichier "essai.txt" avant la suppression des
lignes vides et colonnes vides :


1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101

Après la suppression:

1 1111
2 1011
3 1111
4 0011
6 1111
7 1111
9 0111
10 1011

Mais, le résultat souhaité est d'obtenir un tableau dans la taille est
le nombre des caractères '0' communes qui ont été supprimés et don le
contenu est la position de caractèe '0' supprimé.

Si ceci ça passe bien alors j'obtiens le tableau suivant :
nColumn[0] = 2 et nColumn[1] = 4

Avec 2 et 4 sont les positions communes dont les chaines des
caractères de deuxième champ contient '0'.

S'il vous plaît, je serais très contente pour votre aide.
Avatar
Christian ASTOR
programmation wrote:

Mais, le résultat souhaité est d'obtenir un tableau dans la taille est
le nombre des caractères '0' communes qui ont été supprimés et don le
contenu est la position de caractèe '0' supprimé.

Si ceci ça passe bien alors j'obtiens le tableau suivant :
nColumn[0] = 2 et nColumn[1] = 4

Avec 2 et 4 sont les positions communes dont les chaines des
caractères de deuxième champ contient '0'.



Non, le tableau contient après la lecture du fichier de nCpt lignes:
nColumn[2] = nCpt et nColumn[4] = nCpt
Ce qui signifie qu'il y a autant de "0" que de lignes (donc que des "0")
dans ces colonnes et c'est ce qui est testé dans la 2ème boucle à :
if (nColumn[i] == nCpt)
pour supprimer les colonnes n'ayant donc que des "0".
Avatar
programmation
On 23 juil, 23:50, Christian ASTOR wrote:
programmation wrote:
> Mais, le résultat souhaité est d'obtenir un tableau dans la taille est
> le nombre des  caractères '0' communes qui ont été supprimés et don le
> contenu est la position de caractèe '0' supprimé.

> Si ceci ça passe bien alors j'obtiens le tableau suivant :
> nColumn[0] = 2 et nColumn[1] = 4

> Avec 2 et 4 sont les positions communes dont les chaines des
> caractères de deuxième champ contient '0'.

Non, le tableau contient après la lecture du fichier de nCpt lignes:
nColumn[2] = nCpt et nColumn[4] = nCpt
Ce qui signifie qu'il y a autant de "0" que de lignes (donc que des "0")
dans ces colonnes et c'est ce qui est testé dans la 2ème boucle à :
if (nColumn[i] == nCpt)
pour supprimer les colonnes n'ayant donc que des "0".




Salut,

Voici une partie de votre programme où j'ai ajouté deux instructions:

- printf ("pos = %dn",i); // pour afficher la position de colonne
supprimé à chaque fois.
- printf ("shi = %d n",nShift); // pour afficher le nombre de
colonnes supprimées.

le résultat d"affichage de ces deux instructions est :

pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4
pos = 2
pos = 4

shift = 2

- C'est vraie que l'indice i qui existe dans votre programme au
dessous et exactement dans l'instruction
if (nColumn[i] == nCpt) nous donne à chaque fois la position de
colonne supprimée.
puisque nous avons nCpt = 10 (nombre des lignes du fichier) alors nous
allons obtenir les mêmes positions des colonnes supprimées (la
position 2 et 4 dans notre cas) 10 fois.

1) Comment je vais modifier ce programme pour avoir une seule fois le
résultat ou leiu de 10 fois ?
c'est à dire:
pos = 2
pos = 4

2) Où je vais sauvegarder ce résultat ( les deux positions 2 et 4 )
dans un tableau ou dans un fichier car j'ai besoin de cette
information après ?

3) Dans ce programme, est ce que la variable nShift présente le nombre
des colonnes supprimées ?

Voici une partie du programme :

// Lecture tableau de structures pour supprimer les "0"
for (j = 0; j<nCpt; j++)
{

nShift = 0;
for (i = 0; i<nMaxAttribLength; i++)
{
if (nColumn[i] == nCpt)
{
memmove(&dataTabString
[j].sAttrib[i-nShift], &dataTabString[j].sAttrib[i-nShift+1], strlen
(&dataTabString[j].sAttrib[i-nShift+1]) + 1);
nShift+=1;
printf("pos = %dn",i);
}
}
if (strcspn (dataTabString[j].sAttrib, "1") <
strlen(dataTabString[j].sAttrib))
fprintf(pFileOut, "%s %sn",
dataTabString[j].sNum, dataTabString[j].sAttrib);
}

printf("shi = %d n",nShift);

free(dataTabString);
fclose(pFile);
fclose(pFileOut);



Merci pour votre aide.
Avatar
Christian ASTOR
programmation wrote:

1) Comment je vais modifier ce programme pour avoir une seule fois le
résultat ou leiu de 10 fois ?
c'est à dire:
pos = 2
pos = 4



Forcément à la fin de la boucle sur le nombre de lignes
for (int j = 0; j<nCpt; j++) :


if (nColumn[j] == nCpt)
printf("Pos = %dn", j);
Avatar
programmation
On 24 juil, 11:43, Christian ASTOR wrote:
programmation wrote:
> 1) Comment je vais modifier ce programme pour avoir une seule fois le
> résultat ou leiu de 10 fois ?
> c'est à dire:
> pos = 2
> pos = 4

Forcément à la fin de la boucle sur le nombre de lignes
for (int j = 0; j<nCpt; j++) :

if (nColumn[j] == nCpt)
        printf("Pos = %dn", j);



Salut,

Merci.Oui. j'ai trouvé.

Maintenant, J'ai crée un programme C (application win32 console) avec
visual studio 2008 sous windows. Ce programme tourne bien. il me donne
des résultats sauvegardés dans des fichiers textes et des affichages
dans le console.

Je voudrais faire une interface graphique où il y a des contrôles (des
boutons, des zones textes, des listes...) pour visualiser mes
résultats obtenus par le programme C et aussi je voulais charger dans
des listes qui se trouvent dans l'interface graphique les fichiers
obtenus et pas mal des choses à faire.
Aussi pourquoi pas lancer à partir d'un bouton d'interface le
programme C qui j'ai fait etc...

Je voudrais faire une interface acceptable pour montrer mes résultats
obtenus.

- D'après vous comment je vais utiliser le même outil Visual Studio
2008 pour créer cette interface graphique car cet outil est très riche
puisque elle offre beaucoup des types d'application. J'ai découvert
jusqu'à maintenant les applications console car je suis débutante à
cet outil ?

- Quelle est la différence entre une application console win32 et une
application console CLR ?

- Est ce que je peux créer dans le même espace de travail où j'ai fai t
mon programme C une interface graphique ou bien je dois créer dehors ?

- Avez vous autres solutions ?

S'il vous plaît, j'ai besoin de vos aides.

Merci.
Avatar
programmation
On 24 juil, 16:26, programmation wrote:
On 24 juil, 11:43, Christian ASTOR wrote:

> programmation wrote:
> > 1) Comment je vais modifier ce programme pour avoir une seule fois le
> > résultat ou leiu de 10 fois ?
> > c'est à dire:
> > pos = 2
> > pos = 4

> Forcément à la fin de la boucle sur le nombre de lignes
> for (int j = 0; j<nCpt; j++) :

> if (nColumn[j] == nCpt)
>         printf("Pos = %dn", j);

Salut,

Merci.Oui. j'ai trouvé.

Maintenant, J'ai crée un programme C (application win32 console) avec
visual studio 2008 sous windows. Ce programme tourne bien. il me donne
des résultats sauvegardés dans des fichiers textes et des affichages
dans le console.

Je voudrais faire une interface graphique où il y a des contrôles (de s
boutons, des zones textes, des listes...) pour visualiser mes
résultats obtenus par le programme C et aussi je voulais charger dans
des listes qui se trouvent dans l'interface graphique les fichiers
obtenus et pas mal des choses à faire.
Aussi pourquoi pas lancer à partir d'un bouton d'interface le
programme C qui j'ai fait etc...

Je voudrais faire une interface acceptable pour montrer mes résultats
obtenus.

- D'après vous comment je vais utiliser le même outil Visual Studio
2008 pour créer cette interface graphique car cet outil est très rich e
puisque elle offre beaucoup des types d'application. J'ai découvert
jusqu'à maintenant les applications console  car je suis débutante à
cet outil ?

- Quelle est la différence entre une application console win32 et une
application console CLR ?

- Est ce que je peux créer dans le même espace de travail où j'ai f ait
mon programme C une interface graphique ou bien je dois créer dehors ?

- Avez vous autres solutions ?

S'il vous plaît, j'ai besoin de vos aides.

Merci.



Salut,

1) Dans mon travail, j'utilise des fichiers.

je crée un fichier "essai.txt" pour le remplir

fp = fopen("essai.txt","w");

// je fais des traitements
......fprintf(fp,"hhhhhhhhhhh");

//je ferme le fichier
fclose(fp);

//je veux lire ce fichier
rewind(fp);
fp = fopen("essai.txt","r");

//lire de ce fichier
while(fgets(s,100,fp));
...
fclose(fp);

Comme vous remarquez j'ouvre plusieurs fois le même fichier et je les
ferme plus que fois.

Comment je vais résoudre ce problème d'ouverture et fermeture plus que
fois ?


2) Je voudrais positionner sur la ligne numéro k au lieu de lire ligne
par ligne jusqu'à ligne numéro k.
Alors , comment je positionne directement sur le k ième ligne du
fichier ?


3) Est ce que on peut faire l'union, l'intersection et la différence
entre les lignes de deux fichiers ?

Merci.
1 2 3 4