en ce qui concerne le file.is_open il renvoi 0 ce qui me pârait logique compte tenu j'ai rien dans le fluxEnvoyé par rigobert
en ce qui concerne le file.is_open il renvoi 0 ce qui me pârait logique compte tenu j'ai rien dans le fluxEnvoyé par rigobert
est mon ami !!!
Laurent le code fourni precedemment ne suffit pas ?
Car le code entier est assez conséquent.
est mon ami !!!
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.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 ).
voila un bout de code qui illustre le bleme
Attention y'a des MFC
note le fichier a lire s'appelle 013
est mon ami !!!
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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é.Envoyé par Eusebe
Il marche nickelEnvoyé 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
est mon ami !!!
Hein ?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'EDITEnvoyé par Eusebe
est mon ami !!!
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 :Envoyé par Eusebe
Je fais comment pour avoir leurs valeur en hexa ????
est mon ami !!!
Edit : ou encore, en le récupérant dans une autre string :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2433a5c746f7462e747874
est mon ami !!!
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 !Envoyé par Dark-Water
Bon, après avoir (re) jeté un petit coup d'oeil au code posté, j'ai trouvé ce qui cloche
Mais là, trop tard, je dois partir en weekend...
"La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."
G. CLEMENCEAU
je sais moi non plus j'y comprend plus rien
est mon ami !!!
Nan, allez, je blaguais !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 . 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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)); } ...
"La forme même des Pyramides prouve que de tous temps, les ouvriers n'ont jamais pensé qu'à en faire de moins en moins."
G. CLEMENCEAU
je l'avais deja soulevé ce probleme dans une autre partie de mon code et je l'ai oublié la !!!!!
Un grand à tous pour votre aide et oui je suis un gros
Respect rigobert tu m'as évité de me mettre une balle dans la tete avant le weekend
Et encore merci à tous
est mon ami !!!
Manque plus qu'un clic sur
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager