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
Version imprimable
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
4 if(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