Accueil > Forum > > > > mettre un type"record" comme clé dans un map (C++)
mettre un type"record" comme clé dans un map (C++)
mardi 25 mars 2008 à 13:20:59 |
mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
Bonjour,
Voilà j'ai un type fichier qui est un record (string nom, __int64 taille,FILETIME date) j'aimerai créer un map <Fichier,string> mais il n'accepte pas que je lui passe le type Fichier au moment de l'insert
voici un bout de mon code pour y voir plus claire: class Fichier{ string nom; __int64 taille; FILETIME date; public: Fichier (string nom, __int64 taille,FILETIME date){ this->nom=nom;this->date=date;this->taille=taille; } //............. }
void mettreDansMap(map<Fichier,string> &fichierT,Fichier nom,string attribut){ fichierT.insert(make_pair(nom,attribut)); } Merci Beaucoup de votre prècieuse aide. Babyboo
|
|
mardi 25 mars 2008 à 17:05:14 |
Re : mettre un type"record" comme clé dans un map (C++)

luhtor
|
Il faut que ton type ait un constructeur par défaut. Il faut aussi que ton type dispose d'une fonction de tri. Exemple (un peu crade, mais explicite)
#include <map>
struct MyKey { int value; // Fonction de tri utilisée par std::map bool operator() (const MyKey & _key1, const MyKey & _key2) { return (_key1.value < _key2.value); } };
int main(int argc, char *argv[]) { std::map<MyKey, int, MyKey> lMap; MyKey lKey1 = { 4 }; MyKey lKey2 = { 8 }; lMap[lKey2] = 2; // On insère d'abord le 8 lMap[lKey1] = 2; // puis le 4 std::cout << lMap.begin()->first.value << std::endl; // affiche bien 4 std::cout << (++lMap.begin())->first.value << std::endl; // affiche bien 8 system("PAUSE"); return 0; };
|
|
mardi 25 mars 2008 à 17:17:17 |
Re : mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
Merci mais ça n'allais pas trop mais tu m'as mises sur la piste des operator, après plusieurs rechercher j'ai ajouter ceci à ma classe Fichier et ça fonctionne mais maintenant j'ai encore d'autres problèmes ^^ il veux pas m'inserer tout les fichier certain oui et certain non lol friend int operator ==(Fichier a,Fichier b){ return ((a.taille==b.taille)&&(a.nom==b.nom));//reste la date } friend int operator <(Fichier a,Fichier b){ return ((a.taille<b.taille)&&(a.nom<b.nom));//reste la date } Babyboo
|
|
mardi 25 mars 2008 à 18:54:28 |
Re : mettre un type"record" comme clé dans un map (C++)

luhtor
|
La raison est simple. Il utilise un test de comparaison pour savoir si deux fichiers sont identiques. Avec ton test, deux fichiers sont identiques si leur nom fait la meme longueur. Donc toto.txt écrasera tutu.txt ... Il faut un test plus complet.
|
|
mercredi 26 mars 2008 à 11:26:26 |
Re : mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
mais j'ai tester la taille aussi?le probleme qu'il reste la date a tester mais je ne sais pas trop comment tester un Filetime merci je me doutais qu'il y avait un problème dans mon test mais j'ai pas mal de lacunes encore en c++ alors ca fait beaucoup de problèmes à rèsoudre heureusement que tu m'as aidée c'est gentil de ta part :-)
Babyboo
|
|
mercredi 26 mars 2008 à 11:43:36 |
Re : mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
friend int operator !=(Fichier a,Fichier b){ return (!(a==b));//reste la date } friend int operator >(Fichier a,Fichier b){ return (b<a);//reste la date } friend int operator <=(Fichier a,Fichier b){ return (a>b);//reste la date } friend int operator >=(Fichier a,Fichier b){ return (a<b);//reste la date } J'ai ajouter ces opérator la mais ca ne change rien en principe s'il regarde la aille et le nom je pensais que cela était suffisant, je suis un peus perdue je joint le code complet peut être verez-vous des choses que je n'ai pas vue par manque d'expériences  Babyboo
|
|
mercredi 26 mars 2008 à 11:50:58 |
Re : mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
#include <iostream> #include <iomanip> #include <windows.h> #include<vector> #include<string> #include<map> #include<utility> using namespace std; class Fichier{ string nom; __int64 taille; FILETIME date; public: Fichier (string nom, __int64 taille,FILETIME date){ this->nom=nom;this->date=date;this->taille=taille; } friend int operator ==(Fichier a,Fichier b){ return ((a.taille==b.taille)&&(a.nom==b.nom));//reste la date } friend int operator <(Fichier a,Fichier b){ return ((a.taille<b.taille)&&(a.nom<b.nom));//reste la date } friend int operator !=(Fichier a,Fichier b){ return (!(a==b)); } friend int operator >(Fichier a,Fichier b){ return (b<a); } friend int operator <=(Fichier a,Fichier b){ return (a>b); } friend int operator >=(Fichier a,Fichier b){ return (a<b); } /*bool operator() (const Fichier & _key1, const Fichier & _key2) { return (_key1.nom < _key2.nom); }*/ friend ostream& operator<< (ostream& fout,const Fichier&f){ SYSTEMTIME st; FILETIME ftLocal ; fout <<setw(20)<<left<<f.nom<<' '<< setw(10)<<right<<f.taille<<' '; FileTimeToLocalFileTime(&f.date,&ftLocal); FileTimeToSystemTime (&ftLocal,&st); cout<<setfill('0')<<setw(2)<<st.wDay<<'/' <<setw(2)<<st.wMonth<<'/' <<setw(4)<<st.wYear<<' ' <<setw(2)<<st.wHour<<':' <<setw(2)<<st.wMinute<<':' <<setw(2)<<st.wSecond<<setfill(' '); return fout; } ~Fichier(){} }; //______________________________________________________________________________________ //______________________________________________________________________________________
void mettreDansMap(map<Fichier,string> &fichierT,Fichier nom,string attribut){ map<Fichier,string>::iterator it; cout<<"=====dans mettreDans===========\n";//j'ai fais un test pour voir resultat à un certain moment il y a un //fichier mais il n' l'insert pas certains oui d'autre non cout<<nom<<"av\n"; for (it=fichierT.begin();it!=fichierT.end();++it)cout<<it->first<<"\n"; fichierT.insert(make_pair(nom,attribut)); cout<<"ap\n"; for (it=fichierT.begin();it!=fichierT.end();++it)cout<<it->first<<"\n"; } //______________________________________________________________________________________ //______________________________________________________________________________________
void parcourir ( string attribut,map<Fichier,string> &fichierT){ __int64 taille; FILETIME date; HANDLE hFind; WIN32_FIND_DATA wFindData; hFind = FindFirstFile("*.*", &wFindData); bool trouve = hFind!=INVALID_HANDLE_VALUE; char szFilePath[MAX_PATH+4]; szFilePath + GetModuleFileName(0, szFilePath, MAX_PATH); while(trouve){ if((wFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)!=0){ if(strcmp(wFindData.cFileName,".")!=0 && strcmp(wFindData.cFileName,"..")!=0) { SetCurrentDirectory(wFindData.cFileName);//descendre dans le sous repertoire string Attributenv=attribut+"\\"+wFindData.cFileName; parcourir(Attributenv,fichierT); SetCurrentDirectory(".."); //revenir } } else{ taille=((__int64)wFindData.nFileSizeHigh<<32)+wFindData.nFileSizeLow; FILETIME fileTime1 = wFindData.ftLastWriteTime; FileTimeToLocalFileTime(&fileTime1,&date); Fichier f=Fichier(wFindData.cFileName,taille,date); mettreDansMap(fichierT,f,attribut); } trouve=FindNextFile(hFind,&wFindData); }//fwhile FindClose(hFind);
}//fparcourir/ //----------------------------------------------------------------------------------- string repertoireCourant(void) { const string s(__FILE__); return s.substr(0, s.rfind('\\\\')); } //______________________________________________________________________________________ //_____________________________main_____________________________________________________ //______________________________________________________________________________________ int main(int argc, char *argv[]) { map<Fichier,string>lol; map<Fichier,string>::iterator it; parcourir(repertoireCourant(),lol); cout<<"*****************dans main******************\n"; for (it=lol.begin();it!=lol.end();++it)cout<<it->first<<" "<<it->second<<"\n";
system("PAUSE"); }
|
|
mercredi 26 mars 2008 à 12:38:28 |
Re : mettre un type"record" comme clé dans un map (C++)

luhtor
|
Réponse acceptée !
C'est pas si trivial ton pb. Tout vient de ton opérateur de comparaison. Remplace ca: friend int operator <(Fichier a,Fichier b){ return ((a.taille<b.taille)&&(a.nom<b.nom));//reste la date }
par ca: friend bool operator <(const Fichier & a,const Fichier & b) { if (a.nom < b.nom) return true; else if (a.nom == b.nom) return ((a.date.dwLowDateTime < b.date.dwLowDateTime) && (a.date.dwHighDateTime < b.date.dwHighDateTime)); else return false; }
|
|
mercredi 26 mars 2008 à 14:04:06 |
Re : mettre un type"record" comme clé dans un map (C++)

babyboo1107
|
C'est super je pense pas que j'y arrais pensé il me semble que j'étais encore loin de la solution je te remerci je vais pour voir finir cet exercice : le but etant d'afficher tous les fichiers qui sont en double j'ai encore des choses à faire mais la tu m'as super bien aidée j'étais comme qui dirait bloquée merci encore c'est bête mais je suis très contente
Babyboo
|
|
mercredi 26 mars 2008 à 16:27:34 |
Re : mettre un type"record" comme clé dans un map (C++)

luhtor
|
Juste une petite correction, pour le test de date. Ceci me semble plus exacte que ce que je t'ai mis.
return (((__int64(a.date.dwHighDateTime) << 31) + __int64(a.date.dwLowDateTime)) < ((__int64(b.date.dwHighDateTime) << 31) + __int64(b.date.dwLowDateTime)))
|
|
Cette discussion est classée dans : fichier, taille, date, type, map
Répondre à ce message
Sujets en rapport avec ce message
manipulation fichier texte [ par bencholl ]
I / Utilisation de fichiers texteLe fichier "Etud_2002.don" comporte des lignes ainsi structurées (le caractère ';' est utilisé comme séparateur) : NO
Récupérer taille d'un méga fichier [ par Weedy_59 ]
Enfin j'aurai peut-etre dus écrire en titre, avoir la taille d'un Giga fichier, lol. Oui mon problème c'est que je n'arrive pas à récupérer la taille
QWORD ? [ par Ziman ]
Bonjour,j'aimerai récupérer la taille d'un fichier, j'utilise donc GetFileSize() après l'avoir ouvert avec CreateFile(). Pour les petits fichiers, ben
zlib [ par deck_bsd ]
Bonjour a tous,Voila je fait un petit programme de compression avec la zlib. Mon seul problème est que lorsque je veut décompresser un fichier, forcém
Date [ par talapwetpwet ]
Bonjour, et merci à ceux qui peuvent m'aider.J'ai une appli qui crée un fichier dans un dossier, jusque là ça va.Mais j'ai besoin de déclencher un évè
Connaitre la taille d un fichier en entrée standard [ par adakick ]
Bonjour, je voulais savoir comment on fesait pour connaitre la taille d un fichier sur entrée standard ? Et comme
surcharge delete [ par koala01 ]
Salut, Je m'adresse à vous car je suis confronté à un problème qui me fait perdre mon latin... Je souhaites créer un "gestionnaire de mémoire" dans l
Taille fichier sous linux [ par bigbourin ]
Bonjour a tous, voila je cherche une fonction pour récupéré la taille d'un fichier mais sous linux. donc les API W32 ...voila. Je pensait trouver mon
Réduire taille de fichier API [ par Galmiza ]
Salut,J'ouvre le fichier en lecture+ecriture avec CreateFile, je récupère les données, les modifie, pointe le début du fichier puis je réinjecte des d
taille d'un fichier sur le disque [ par germs13 ]
salutje travaille sous vc6.0 mais pas en mfcje voudrais recuperer la taille d'un fichier sur le disque, pour l'instant j arrice seulement a recuperer
Livres en rapport
|
Derniers Blogs
POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|