Et quand tu arrives dans ta fonction Importer, "File" est toujours bon ?
Ca contiens toujours ton chemin d'accès ?
Version imprimable
Et quand tu arrives dans ta fonction Importer, "File" est toujours bon ?
Ca contiens toujours ton chemin d'accès ?
Il y a peut être un truc que tu n'as pas vus avec le debugger.
Je te conseille de faire une comparaison avec ta chaîne en dur pour être sur.
Il y a nécessairement une différence. :mouarf:
Déjà, vous êtes sûrs qu'il n'y a pas de conflit unicode/non-unicode ?
Je pense qu'il y aurait une flopée de warnings ou erreurs si c'était le cas mais je me permets de poser la question à tout hasard...
oui c'est toujours bon c'est au niveau de file que ca planteCitation:
Envoyé par Eusebe
c'est exact la fonction me renvois -1Citation:
Envoyé par dockurt2k
Code:
1
2 string pathb = "C:\\Documents and Settings\\Julien\\Mes documents\\Mes fichiers reçus\\014"; int ret = pathb.compare(val);
C'est peut être un probléme d'unicode, ton chemin comprend un ç.
Je ne m'y connait pas beaucoup mais ça peut causer des souçis
Autre détail, ton fichier s'appelle 014 sans extension? C'est normal
as tu essayé sur un fichier à la racine (le c:\toto.txt)?
c'est normal qu'il n'y est pas d'extension et meme avec c:\\toto.txt ca marche pas les chaines sont différentes.
Pour l'unicode je sais pas comment faire
Déjà, vérifie que sizeof(TCHAR)==1.
Si c'est égal à 2, c'est que tu es en Unicode. La procédure à suivre dans ce cas-là dépend de ta version de Visual.
bon si ca marche avec c:\\toto.txt c'est probablement pas un probléme d'unicode.
bizarre que le chemin soit différent .
A ta place je ferais une fonction de comparaison charactére par charactére des deux chaînes en mettant un point d'arrét sur le charactére différent entre les deux. remarque c'est peut être que l'un est plus long que l'autre.
Donc mon conseil:
- comparer les tailles
- parcourir les chaînes jusqu'a trouver le charactére qui différe
ca marche pas avec toto.txtCitation:
Envoyé par dockurt2k
Citation:
Envoyé par Médinoc
ca renvoi 1
Donc, il semblerait que ce ne soit pas un problème d'unicode.
Essaie d'afficher les contenus des deux chaînes en hexa...
erreur d'écriture, désoleCitation:
Envoyé par Dark-Water
bon j'avais fait une petite boulette les 2 chaines sont identique mais je n'est tjs rien dans file :?
:koi: ca marche meme plus avec la chaine en dur ??? :?
bon je regarde pkoi et je vous tiens au courant
Comme cela au moins c'est cohérent ;)Citation:
Envoyé par Dark-Water
ca marche que si ma chaine de caractere est un define pas si je la met ds un string :aie:
ca me tape legerement sur le système :bug: :arf: :evilred: :furieux:
Là ça deviens grave.
Par acquis de conscience, sur un projet console C++ standard, tu peut l'ouvrir même avec une chaîne ?
Je ne crois pas que la question ait été soulevée : quel est le code qui te fait dire "il n'y a rien dans file" ? Et qu'y a t-il réellement dans le fichier ?
Ensuite le plus simple serait que tu puisses fournir un exemple complet minimal qui reproduit le problème. Ca ne devrait pas être très dur dans ce contexte.
Dans le même ordre d'idée, si en tout premier dans la fonction Importer() tu fais un file.is_open(), qu'obtiens-tu en retour ?Citation:
Envoyé par Laurent Gomila
Citation:
Envoyé par Laurent Gomila
file >> line ;
je regarde au debugguer le contenu de line
actuellement avec la variable line vaut "" alors qu'avec define line vaut "POINTS"
le fichier contient normalement en premiere ligne POINTS 12332
puius une serie de coordonné
125 32 65
pour le reste je regarderai demain faut que je rentre chez moi
en ce qui concerne le file.is_open il renvoi 0 ce qui me pârait logique compte tenu j'ai rien dans le fluxCitation:
Envoyé par rigobert
Laurent le code fourni precedemment ne suffit pas ?
Car le code entier est assez conséquent.
Ce que tu pourrais faire (et ce que te demande Laurent), c'est isoler le problème : créer un bout de code très simple, très court (pourquoi pas uniquement un main) qui reproduise ton problème.Citation:
Envoyé par Dark-Water
Par exemple, essaie de créer un nouveau projet et de faire ça dans le main :
- création d'une string et affectation du chemin du fichier
- ouverture du fichier
- test avec file.is_open()
Si ton problème est toujours présent, tu nous donne ce code (qui serait directement compilable), et on pourrait ainsi tester chez nous, et te dire ce qui pose problème (du moins, si on le trouve :aie:).
voila un bout de code qui illustre le bleme
Attention y'a des MFC
note le fichier a lire s'appelle 013
Bon, moi, j'ai pas les MFC... (et pas l'intention de les installer, du moins pas de suite...).
Mais dis-moi ce que tu obtiens si tu compiles et exécutes le code suivant (avec un fichier c:\toto.txt qui existe, bien sûr !) :
Code:
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 #include <string> #include <iostream> #include <fstream> int main() { std::string path = "C:\\toto.txt"; std::cout << "Fichier : " << path << std::endl; std::ifstream file(path.c_str()); std::string line; if (file.is_open()) { std::cout << "Fichier ouvert !" << std::endl; std::cout << "Contenu : " << std::endl; while ( ! file.eof() ) { file >> line; std::cout << line << std::endl; } } else { std::cout << "Fichier non ouvert !" << std::endl; } }
Ben moi j'ai pas trop envie de les utiliser je deteste les MFC mais bon la j'ai été obligé.Citation:
Envoyé par Eusebe
Il marche nickelCitation:
Envoyé par Eusebe
EDIT: bon ca y'est ca marche quand je met l'adresse du fichier en dur ds la variable mais pas kan j'utilise la boite de dialogue.
j'avais laissé le ifstream f (path.c_str) c'est ca qui foutait la merde.
Mais bon avec la boite de dialogue ca marche pas les chaines doivent etre différente
Hein ?Citation:
Envoyé par Dark-Water
Là ça fonctionne alors que dans ton projet, si tu utilises une string initialisée avec "C:\\toto.txt" (donc la même chose), file.is_open te renvoie false ?
C'est bien ça ?
ouep cf l'EDITCitation:
Envoyé par Eusebe
Ok, donc on reviens en arrière...
Puisque les chaînes sont différentes, est-ce que tu peux nous donner leur représentation hexadécimale ?
Heu comme on peut pas dire que j'ai à faire ca souvent ma question est simple :Citation:
Envoyé par Eusebe
Je fais comment pour avoir leurs valeur en hexa ????
Edit : ou encore, en le récupérant dans une autre string :Code:
1
2
3
4
5
6
7
8 std::string path = "C:\\toto.txt"; std::cout << "Fichier : " << path << std::endl; std::cout << "en hexa : "; for(int i=0; i < path.size(); ++i) std::cout << std::hex << (int)path[i]; std::cout << std::dec << std::endl;
Code:
1
2
3
4
5
6
7
8
9
10
11
12 std::string path = "C:\\toto.txt"; std::cout << "Fichier : " << path << std::endl; std::string pathhexa; std::ostringstream oss; for(int i=0; i < path.size(); ++i) oss << std::hex << (int)path[i] << " "; pathhexa = oss.str(); std::cout << "en hexa : " << pathhexa<< std::endl;
c'est les meme cad :
Code:
1
2433a5c746f7462e747874
Non, là je te suis plus...
Tu as dis :
Et je suis d'accord avec toi, si ça fonctionne quand tu le met 'en dur' et pas en retour de la boite de dialogue, c'est que les chaînes sont différentes ! Et donc, ça ne peut pas être la même chose en hexa ! :marteau:Citation:
Envoyé par Dark-Water
Bon, après avoir (re) jeté un petit coup d'oeil au code posté, j'ai trouvé ce qui cloche :mouarf:
Mais là, trop tard, je dois partir en weekend... :aie:
je sais moi non plus j'y comprend plus rien :mur: :scarymov:
Nan, allez, je blaguais ! :lol:Citation:
Envoyé par rigobert
Avant de donner la solution, je voudrais juste dire que faire du copié/collé de bouts de code c'est une chose (tous les programmeurs ou presque le font) ; mais faire plusieurs copié/collés de bouts de codes de manifestement différentes origines dans une même fonction sans se poser de questions, sans essayer un tant soit peu d'harmoniser le tout, c'est carrément n'importe quoi et ça produit ce (beau) résultat :aie: . A bon entendeur...
La raison du bug, donc (extrêmement simple) :
Lorsqu'aucun flag de partage n'est spécifié, CFile::Open() ouvre les fichiers en mode exclusif.
Or, si tu regardes bien ton code, tu verras qu'ici :
il y a un CFile::Open() qui ouvre ton fichier en mode exclusif ; et il n'est refermé que lorque la fonction s'achève (allocation automatique de CFile au début de la fonction).Code:
1
2
3
4if(FileOpenDialog.DoModal()==IDOK) { VERIFY(File.Open(FileOpenDialog.GetPathName(),CFile::modeRead)); }
Ce qui fait donc que toute tentative de nouvelle ouverture du fichier entre-temps va forcément échouer, quelle que soit la méthode utilisée (STL, MFC, CRT...) puisque le verrou est posé au niveau du système.
La solution : limiter la portée de l'objet CFile au bloc conditionnel dans lequel la vérification est faite :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// CFile File; <<< supprimer ça char* fichier; CString OpenFilter; OpenFilter = "Text File (*.*)|*.*||"; CFileDialog FileOpenDialog(TRUE, NULL, NULL, OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST, OpenFilter, // filter AfxGetMainWnd()); // the parent window if (FileOpenDialog.DoModal()==IDOK) { CFile File; <<< rajouter ça VERIFY(File.Open(FileOpenDialog.GetPathName(),CFile::modeRead)); } ...
:pleure:
je l'avais deja soulevé ce probleme dans une autre partie de mon code et je l'ai oublié la !!!!!
Un grand :merci: à tous pour votre aide et oui je suis un gros :boulet:
Respect rigobert :hola: tu m'as évité de me mettre une balle dans la tete avant le weekend
Et encore merci à tous
Manque plus qu'un clic sur :resolu: :D