Traitement d'un fichier

Signaler
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
-
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
-
Salut,
J'ai un fichier texte bien formé contient deux champs: objet et attribut.
tous les objets sont des entiers et tous les attributs sont de chaines de caractères de même 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ême position dans chaque chaine de caractère.
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 à 0.

j'ai trouvé une difficulté de résoudre ce problème, de plus imaginez si nous avons un fichier volumineux.

Mon idée:
je parcoure seulement la première ligne de fichier. Pour tout 0 de chaine de première ligne je teste si je trouve dans la même position où je trouve 0 de chaine de première ligne dans les chaines des autres lignes.
Cette solution este théorique. Imaginez si nous avons un fichier volumineux.De plus la perte de curseur et de position.

SVP, j'ai besoin de vos aides.

4 réponses

Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
par exemple nous allons supprimer la colonne en rouge car nous avons le 0 dans la même position.

essai.txt:

1      11100

2      10101

3      01001

4      10001
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Problème d'algorithme !!! mais simple

Tu prend chaque nombre et tu fais un OU avec chacun d'eux
Tu parcourt les bits du nombre obtenu pour repérer la position n du 0
Tu reprend chaque nombre que tu soustrait à 2 puissance n
Messages postés
28
Date d'inscription
dimanche 27 mars 2005
Statut
Membre
Dernière intervention
13 mars 2012

Heu il manque la fin

Tu fais une soustraction de 2 puissance n pour tous les bits jusqu'à la fin du nombre pour ton exemple n va de 1 à 4
Messages postés
393
Date d'inscription
lundi 22 juin 2009
Statut
Membre
Dernière intervention
23 décembre 2011
5
Salut,

Voici le programme C:
Code : C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59, #include <stdio.h>

intmain()
{
FILE*fichier;
chartmp;
inti;
inta=1;/*ecriture*/
intb=1;/*lecture*/
fichier=fopen("essai.txt","r+");
if(!fichier)
{
printf("erreur d'ouverture du fichier\n");
exit(-1);
}
else
{

// tmp = fgetc(fichier);
fscanf(fichier,"%c",&tmp);
while(tmp!=EOF){
/*On fait une boucle pour parcourir tous les retours chariot inutiles*/
while(tmp=='\n'){
fseek(fichier,b,SEEK_SET);/*On se positionne sur b*/
tmp=fgetc(fichier);/*On enregistre le caractère*/
fseek(fichier,a,SEEK_SET);/*On revient sur a*/
fputc(tmp,fichier);/*On écrit le caractère*/
b++;/*On fait avancer la tête de lecture*/
a++;/*On fait avancer la tête d'écriture*/
}
if(tmp==EOF){
break;
}
for(i=0;i<4;i++){/*On se place sur l'élément à effacer*/
fseek(fichier,b,SEEK_SET);
tmp=fgetc(fichier);
fseek(fichier,a,SEEK_SET);
fputc(tmp,fichier);
a++;
b++;
}
b++;/*On efface l'élément en faisant un décalage de tête de lecture*/
while(tmp!='\n'){/*On continue*/
fseek(fichier,b,SEEK_SET);
tmp=fgetc(fichier);
if(tmp==EOF)
break;
fseek(fichier,a,SEEK_SET);
fputc(tmp,fichier);
a++;
b++;
}
}

//truncate(argv[1], a); /*On supprime les caractères qui restent*/
fclose(fichier);
return0;
}
}


le fichier texte avant l'exécution est:

1 11100

2 10101

3 01001

4 10001


A titre d'information, il n' y pas des lignes vides.


Après l'exécution on aura le fichier suivant:


1 1110


2 1011


3 0101


4 10010001


Je remarque que nous obtenons le résultat mais le fichier résultat
contient des lignes vides(saut de lignes)par rapport le premier contenu
de fichier.

et il contient la partie rouge qui est une partie superflue.


Comment on évite ces saut de lignes(lignes vides)?

et comment on supprime la partie rouge superflue ?