begin process at 2012 05 30 18:59:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Tri d'un fichier


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

Tri d'un fichier

dimanche 19 juillet 2009 à 20:43:15 | Tri d'un fichier

boualiasma

Salut,

J'ai un fichier texte qui contient deux champs:
- cin de type entier
- indication de type chaine de carctère

la taille de deuxième champ est la même dans tout le fichier.
Ce fichier est appelé fich.txt, est le suivant:
10 110101
20 101101
30 111101
40 001101
55 001000
66 110101
79 110001
85 111010
99 010101
1000 100101

Je voudrais écrire un programme C sous Windows pour trier ce fichier selon le deuxième champ indication de sorte que le cin qui contient de plus de 1 dans son indication alors il sera placé en premier lieu.

par exemple:
le cin 10 possède quatre 1 dans son indication
le cin 30 possède cinq 1 dans son indication
et etc...

Donc le résultat il sera dans le même fichier ou autre fichier comme le suivant:
30 111101
85 111011
10 110101
20 101101
66 110101
40 001101
79 110001
99 010101
55 001000

Pouvez-vous m'aider comment je vais procéder ?

Merci.


dimanche 19 juillet 2009 à 20:56:54 | Re : Tri d'un fichier

boualiasma

Salut,

J'ai oublié de mettre la ligne 1000 100101
Donc,le résultat après le tri est :
30 111101
85 111011
10 110101
20 101101
66 110101
40 001101
79 110001
99 010101
1000 100101
55 001000

mardi 21 juillet 2009 à 16:18:49 | Re : Tri d'un fichier

rt15

Membre Club Administrateur CodeS-SourceS

Salut,

Le programme doit pouvoir gérer des gros fichier (>50 Mo) ? => Va falloire pas lire le fichier tout d'un coup -> compliqué.

Ou au contraire très peu de données ? (100 lignes...) -> bubble sort, très simple. Sinon Quick sort.

Ou entre les deux ?

mercredi 22 juillet 2009 à 09:33:28 | Re : Tri d'un fichier

boualiasma

Salut,

Je trouve la fonction prédefinie qsort() dans le lien suivant:
http://www.cplusplus.com/reference/clibrary/cstdlib/qsort/

- C'est cette fonction que vous me parlez ?

- Est ce que cette fonction est implémenté par un tri rapide ou autre ?

- Cette fonction fait un tri croissant alors comment je vais la changer pour quelle puisse faire un tri décroissant ?

- Comment je vais utiliser cette fonction pour trier mon fichier comme est décrit au dessus ?

Merci.

mercredi 22 juillet 2009 à 10:02:53 | Re : Tri d'un fichier

rt15

Membre Club Administrateur CodeS-SourceS

C'est marrant, j'ai posé 50 questions et j'ai pas eu de réponses... Je devrais faire pareil : essayer de répondre à côté des questions.

boualiasma a écrit

- C'est cette fonction que vous me parlez ?


Non mais celle là peut marcher aussi.

boualiasma a écrit

- Est ce que cette fonction est implémenté par un tri rapide ou autre ?


Oui c'est bien un tri rapide (quicksort).


boualiasma a écrit

Cette fonction fait un tri croissant alors comment je vais la changer pour quelle puisse faire un tri décroissant ?


Bin c'est facile, il suffit d'inverser la fonction de comparaison.

Code C/C++ :
int compare (const void * a, const void * b)

{
return ( *(int*)b - *(int*)a );
}


boualiasma a écrit

- Comment je vais utiliser cette fonction pour trier mon fichier comme est décrit au dessus ?


Il y a deux différences majeures.
D'une part ta comparaison est un peu particulière et se fait sur du texte, alors que l'exemple se fait sur des entiers. Ensuite, cette fonction travaille sur un tableau de structures de taille fixe. Ce qui n'est pas le cas de ton fichier a priori. Le premier champs semble de taille variable. Donc il faudrait charger tout ça dans un tableau.

Donc faudrait par exemple que tu définisses une structure.

Code C/C++ :
typedef struct _MY_DATA

{
char lpField1[10];
char lpField2[8];
}
MY_DATA;


Et faudrait que tu définisses un tableau de cette structure et que tu la remplisse avec fscanf.

Code C/C++ :
MY_DATA lpFileContent[200];


i = 0;
while (fscanf(lpFile, "%s %s", lpFileContent[i]->lpField1, lpFileContent[i]->lpField2) == 2) i++;


Et enfin que tu appelles qsort.

Code C/C++ :
qsort(lpFileContent, i, sizeof(MY_DATA), compare);


Avec une fonction compare qui compte les "1".

mercredi 22 juillet 2009 à 11:02:45 | Re : Tri d'un fichier

boualiasma

Salut,

Tout d'abord je m'excuse car je n'est pas fait attention à vos questions.
je vais répondre:
Oui, je travaille sue des fichiers volumineux.

Oui, je voudrais utiliser le tri rapide.

Vous dites :
int compare (const void * a, const void * b)

{

return ( *(int*)b - *(int*)a );

}

Qu'est ce que je passe à cette fonction comme paramètre et c'est quoi son contenu ?

vous dites :
Avec une fonction compare qui compte les "1".

Mais, je vois que cette fonction compare deux constantes. C'est çà ?


Voici la fonction qui compte le nombre du caractère 1 dans le deuxième champ:

int compte( ch)
char ch[32]
{
int i,k=0;
for(i=0; i < strlen (ch) ; i++)
{
if (ch[i] = '1');
k++;
}
return (k);

}

avec "ch" est le deuxième champ du fichier.

Mais cette fonction compte le nombre de 1. Mais, elle ne fait pas la comparaison.

Avez-vous une solution ?

Merci.

mercredi 22 juillet 2009 à 11:54:24 | Re : Tri d'un fichier

rt15

Membre Club Administrateur CodeS-SourceS

Cette fonction prend en paramètre deux pointeurs sur des cases du tableau passé à sqsort.
Dans ton cas ce sera deux pointeurs sur des MY_DATA.

Donc ça fera quelque chose comme ça :

Code C/C++ :
int compare (const void * a, const void * b)

{
MY_DATA* dataA;
MY_DATA* dataB;

dataA = (MY_DATA*)a;
dataB = (MY_DATA*)b;
return (compte(dataB->lpField2) - compte(dataA->lpField2));
}

mercredi 22 juillet 2009 à 14:00:01 | Re : Tri d'un fichier

boualiasma

Salut,

Voici une partie de programme :

typedef struct dataStruct
{
int cin;
char indication[32];
int nombre; //contient le nombre de 1 dans le deuxème champ indication donc je vais faireun tri décroissant sur ce nombre

} dataStruct;

int compare(const void* va,const void* vb)
{
dataStruct* a,b;
a = (dataStruct*)va;
b = (dataStruct*)vb;

return (b.nombre - a.nombre);

// ici, tu as 2 elements a et b, a toi de coder la comparaison : si a<b (selon ton critere) renvoie 1, sinon renvoie 0.

}

int main()
{

....
....
qsort(dataTabString,nCpt,sizeof(dataStruct),compare);


...

}


Après la compilation, j'ai le message d'erreur dans le fonction compare:

Error: incompatible types assignment
Error: request for member 'nombre' in something not a structure or union

mercredi 22 juillet 2009 à 14:04:26 | Re : Tri d'un fichier

rt15

Membre Club Administrateur CodeS-SourceS

a et b sont des pointeurs.

return (b->nombre - a->nombre);

mercredi 22 juillet 2009 à 15:46:22 | Re : Tri d'un fichier

boualiasma

Salut,

Je vous remercie pour vos aides.

Après le tri de fichier. Il me manque une partie concernant l'indexation du ce fichier.

Soit essai.txt le fichier trié:

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

Ce fichier contient deux champs: cin (un entier) et indication (une chaine de caractère)

Je voudrais décomposer ce fichier en sous fichiers de manière que chaque sous ficher contient le même nombre du caractère 1 dans son deuxième champ appelé indication.
Puisque le fichier est trié dans le sens décroissant ceci nous aide pour faire ceci.

Après la décomposition, Je vais exécuter le même traitement sur chaque sous fichier obtenu.



Je dois obtenir le résultat suivant:
essai1.txt :
3 1111
6 1111
1 1111

essai2.txt :
10 1011
9 0111
2 1011

essai3.txt :
4 0011


Comme vous voyez le fichier essai1.txt contient les cin qui ont quatre 1 dans leurs indications,
le fichier essai2.txt contient les cin qui ont trois 1 dans leurs indications,
le fichier essai3.txt contient les cin qui ont deux 1 dans leurs indications.

S'il vous plaît, Avez-vous une idée comment je vais décomposer le fichier trié de grande taille en sous fichiers de taille moins ?

et comment je vais accéder après à ces sous fichiers ?


Merci.


1 2

Cette discussion est classée dans : fichier, tri, contient, cin, indication


Répondre à ce message

Sujets en rapport avec ce message

mots croisés [ par bissmillah ] J'aimerai avoir de l'aide grace aux menbres inscrits,c'est a props d'un projet que j'ai a faire en c++ (les mots croisés),je doit créer un fichier tex tri alphabétique ultra rapide de chaines de caractères de longueur variable [ par mslider ] -- Bonjour, je sais que c'est un forum dédié au C mais je vais parler de pascal. En effet je connais bien ce langage et je l'ai utilisé pour trier a ActiveX : Quelques questions [ par Nodoka ] Bonjour,J'aimerai avoir quelques précisions sur l'activex et son processuce d'installation.Imaginons que l'on se retrouve sur une page web qui contien compilation [ par bousfiha ] bonjour et merci de lire ma question.j'ai deux fichiers source ".c" un fichier "main" qui contient le main et un fichier "fct" qui contient les foncti Détection des éspaces dans un fichier qui contient du texte [ par apu04 ] Bonjour à tous, J'aimerais savoir si c'est possible de détecter un espace dans un fichier texte, si oui avec quelle fonction sachant que je travaille Ouvrir flux sur fichier dont le chemin contient des espaces (besoin d'aide:))) [ par vychnou ] Es ce que quelqun saurait comment ouvrir un flux sur un fichier dont le nom ou le chemin contient des espaces?ex:string destination="c:\program files\ lecture de fichier texte [ par mig73 ] salut a tousj'ai un projet à réaliser avant la fin de la semaine alors si vous pouvez m'aider c'est COOLma tâche est la suivante:je dois pouvoir lire Probleme de compilation [ par draken ] Bonjour à tous ,mon but est de placer chaque classe dans chaque fichier --> utilisation separee des classes VOICI LE PROBLEME Login mdp en C [ par shenron ] Slt,Dites moi, je vais faire un acces login mot de passe sous C dans un prog, c koi la meilleure solution?1- Un fichier qui contient tous les login et


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,702 sec (4)

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