begin process at 2012 05 29 14:34:26
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Divers

 > 

PROBLÈME crosses initialization of 'std::ifstream


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

PROBLÈME crosses initialization of 'std::ifstream

jeudi 29 avril 2010 à 22:21:47 | PROBLÈME crosses initialization of 'std::ifstream

charleslemagicien

Bonjour à tous,

J'ai un problème avec ma source j'utilise la fonction ifstream dans mon programme... Tout fonctionne à merveille par contre au moment de la compilation une erreur m'apparaît "crosses initialization of 'std::ifstream"...

Voici la source qui cause problème:

// premier ifstream

ifstream Account_GetID;

Account_GetID.open(String_DATA, ios::in);

if(Account_GetID)
{

string PWDString;

Account_GetID >> PWDString;
Account_GetID.close();

// deuxieme ifstream

ifstream LoginCheck;

LoginCheck.open(String_login, ios::in);

if(LoginCheck)
{

string LoginPWDString;

LoginCheck >> LoginPWDString;
LoginCheck.close();

// ==========END===

Voilà je ne comprend pas pourquoi ses deux ifstream entre en conflit pourtant il me semble bien définit du moins à mon avis mais le compilateur n'est pas d'accord...

dernier détail si je fais compiler ma source avec seulement une des deux fonctions ifstream sa marche nickel !

Quelqu'un peut-il m'éclairer

Merci d'avance




jeudi 29 avril 2010 à 23:07:40 | Re : PROBLÈME crosses initialization of 'std::ifstream

CptPingu

Administrateur CodeS-SourceS
Ceci fonctionne parfaitement chez moi:
Code C/C++ :
#include <iostream>
#include <fstream>

int main()
{
  std::string String_DATA("toto.txt");
  std::string String_login("pouet.txt");
  std::ifstream Account_GetID;

  Account_GetID.open(String_DATA.c_str(), std::ios::in);

  if (Account_GetID)
  {
    std::string PWDString;

    Account_GetID >> PWDString;
    Account_GetID.close();

    // deuxieme ifstream

    std::ifstream LoginCheck;

    LoginCheck.open(String_login.c_str(), std::ios::in);

    if (LoginCheck)
    {
      std::string LoginPWDString;
      LoginCheck >> LoginPWDString;
      LoginCheck.close();
    }
  }

  return 0;
}


J'ai compilé comme ceci:

g++ -W -Wall -Wabi -pedantic main.cc



PS: Évite les "using namespace", voir: [ Lien ]

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
jeudi 29 avril 2010 à 23:15:25 | Re : PROBLÈME crosses initialization of 'std::ifstream

charleslemagicien

je vais tester ta solution par contre un petit problème se pose! le String_DATA et le String_Login sont construit de cette façon:

strcpy(String_DATA, "C:\\Windows\\DBAcess\\DATA\\Secure\\");
strcat(String_DATA, DATAName);
strcat(String_DATA, ".sDATA");

strcpy(String_login, "C:\\Windows\\DBAcess\\User\\");
strcat(String_login, LOGIN);
strcat(String_login, ".dbacess");

Donc si je déclare simplement ainsi ceci me cause problème !
std::string String_DATA;
std::string String_login;

Désolé de mon ignorance je suis habitué au C donc j'ai un peu de difficulté a adapter au C++
jeudi 29 avril 2010 à 23:18:33 | Re : PROBLÈME crosses initialization of 'std::ifstream

CptPingu

Administrateur CodeS-SourceS
Tu gardes les:
* String_DATA
* String_login
sous forme de char* et tu vires juste les c_str().
Ex:
char* String_DATA = ...;
Account_GetID.open(String_DATA, std::ios::in);

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
jeudi 29 avril 2010 à 23:21:56 | Re : PROBLÈME crosses initialization of 'std::ifstream

CptPingu

Administrateur CodeS-SourceS
Ou alors, je viens d'y penser, tu oublies les strcpy, inutile en C++.
Genre:
Code C/C++ :
std::string String_DATA = "C:\\Windows\\DBAcess\\DATA\\Secure\\" + DATAName + ".sDATA";
std::string String_login = "C:\\Windows\\DBAcess\\User\\" + LOGIN + ".dbacess";


_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
jeudi 29 avril 2010 à 23:28:38 | Re : PROBLÈME crosses initialization of 'std::ifstream

charleslemagicien

j'ai essayé tes multiples idées mais j'arrive toujours au même problème de "crosses initialization" je me dis que le problème viens peut-être d'ailleurs dans le code alors je t'affiche toute la source:


// ===Include=====================================================

#include <fstream>
#include <windows.h>
#include <winable.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <time.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <cstdio>

using namespace std;

// =================================================END Include===

int main(void)
{


int hashd5 = 0;

char Option [80];
char Option_1 [] = "1";
char Option_2 [] = "2";
char Option_3 [] = "3";
char LOGIN [80];
char DATAName [80];
char String_login [80];
char String_DATA [80];
char MasterKey [80];
char Value_MasterKey [] = "Clm89mk";


FILE *OPEN_File;


RESET_Key:

printf("Master Key:");
gets(MasterKey);
printf("\n\n");
if (strcmp (MasterKey, Value_MasterKey) == 0)
{
goto RESET_MenuOption;
}
else {
printf("Mauvaise Cle !\n\n");

goto RESET_Key;
}

RESET_MenuOption:

printf("Menu\n");
printf("==================================================\n");
printf("Mot de passe Utilisateur.......................(1)\n");
printf("Mot de passe Fichier DATA......................(2)\n");
printf("Quitter........................................(3)\n\n");

StartMenu:

printf("Votre choix:");
gets(Option);

if (strcmp (Option, Option_1) == 0)
{
goto Option_1_Check;
}
else if (strcmp (Option, Option_2) == 0)
{
goto Option_2_Check;
}
else if (strcmp(Option, Option_3) == 0)
{
exit(0);
}
else {
printf("choix invalide\n\n");

goto StartMenu;
}

Option_1_Check:

printf("\nNom d'utilisateur:");
gets(LOGIN);

strcpy(String_login, "C:\\Windows\\DBAcess\\User\\");
strcat(String_login, LOGIN);
strcat(String_login, ".dbacess");

OPEN_File = fopen(String_login, "r");

if (OPEN_File == NULL)
{

printf("Cet utilisateur n'existe pas\n\n");

goto Option_1_Check;

}
else {
goto RecoveryLOGIN;
}

RecoveryLOGIN:

ifstream LoginCheck;

LoginCheck.open(String_login, ios::in);

if(LoginCheck)
{

string LoginPWDString;

LoginCheck >> LoginPWDString;
LoginCheck.close();


char *ConvertString_PwdID1;

ConvertString_PwdID1 = new char [LoginPWDString.size()+1];
strcpy (ConvertString_PwdID1, LoginPWDString.c_str());

for(hashd5 = 0; hashd5 < strlen(ConvertString_PwdID1); hashd5++){

ConvertString_PwdID1[hashd5] = ConvertString_PwdID1[hashd5] - 16;
}
printf("Le mot de passe de \"%s\" est: \"%s\"\n\n", LOGIN, ConvertString_PwdID1);
system("pause");
system("cls");
}

goto RESET_MenuOption;


// ===================================================

Option_2_Check:

printf("\nNom fichier DATA:");
gets(DATAName);

strcpy(String_DATA, "C:\\Windows\\DBAcess\\DATA\\Secure\\");
strcat(String_DATA, DATAName);
strcat(String_DATA, ".sDATA");

OPEN_File = fopen(String_DATA, "r");

if (OPEN_File == NULL)
{

printf("Ce fichier DATA protege n'existe pas\n\n");

goto Option_2_Check;

}
else {
goto RecoveryDATA;
}

RecoveryDATA:

ifstream Account_GetID;
Account_GetID.open(String_DATA, ios::in);

if(Account_GetID)
{

string PWDString;

Account_GetID >> PWDString;
Account_GetID.close();


char *ConvertString_PwdID;

ConvertString_PwdID = new char [PWDString.size()+1];
strcpy (ConvertString_PwdID, PWDString.c_str());

for(hashd5 = 0; hashd5 < strlen(ConvertString_PwdID); hashd5++){

ConvertString_PwdID[hashd5] = ConvertString_PwdID[hashd5] - 16;
}
printf("Le mot de passe du fichier \"%s\" est: \"%s\"\n\n",DATAName, ConvertString_PwdID);
system("pause");
system("cls");
}
goto RESET_MenuOption;

return 0;
}


jeudi 29 avril 2010 à 23:56:43 | Re : PROBLÈME crosses initialization of 'std::ifstream

CptPingu

Administrateur CodeS-SourceS
Réponse acceptée !
Oula, ça pique au yeux !
Effectivement tu as fait du C. Mais le C++ est un langage différent.
J'ai du mal à comprendre pourquoi tu ne le fais pas en C ? Quelle intérêt as-tu à le faire en C++ ?
Pour que ce soit du C++ propre, il faudrait quasiment tout refaire.

Il y a aussi des trucs super horribles:
- Les gotos (les cas où un goto est utile est très très rare ! Quand on place un goto dans son code, il y a 99% de chance qu'il ne soit pas justifié).
- Mono-fonction: on découpe son code en petite fonction. Une fonction ne devrait pas excéder 25 lignes en moyenne (hors commentaire).
- FILE* => Tu devrais utiliser std::ofstream et std::ifstream
- char* => std::string et std::stringstream
- include windows/conio/time => inutile pour ce code, et tu casses la portabilité (je suis Linux, et ça se voit tout de suite). En retirant des includes inutile j'ai pu compiler.
- gets => fonction non standard, à éviter. Préférer std::cin de toute façon en C++.
- Bannir totalement les "using namespace std;", comme déjà expliqué.
- system: A bannir aussi, brise la portabilité.

Pour répondre techniquement à ta question:
Cette erreur est provoqué par les gotos. Chaque variable à une portée (un scope). Or tu définis un std::ifstream dans un scope sous l'égide d'une étiquette. Le compilateur ne considère pas que cette variable est isolée, donc sa destruction est effective au sortir de la fonction main. Et comme tu peux potentiellement revenir sur celle-ci alors qu'elle n'a théoriquement pas été détruite, le compilateur s'en rend compte et te dit que tu redéclares encore cette variable.
Pour éviter ceci, tu simules un scope à l'aide d'accolades.

Ex:


label:
std::ifstream pouet;
...
goto label;
...
label2:



Correction en:


label:
{
std::ifstream pouet;
...
goto label;
...
}
label2:
{
}



Bien évidemment, je te conseil de choisir un langage (C ou C++) et de l'utiliser correctement (on ne fais pas du C++ comme du C).

_____________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
vendredi 30 avril 2010 à 00:07:15 | Re : PROBLÈME crosses initialization of 'std::ifstream

charleslemagicien

Je suis bien d'accord que ma source est bordélique et mal conçu mais je dois te dire que j'ai appris sur le tas comme on dis j'ai découvert cette passion très jeune mais sans jamais avoir de réelle formation. Ce sont par contre des gens comme toi qui me font avancé et me donne le goût de m'investir sérieusement dans la programmation... Mais par ou commencer je ne le sais pas...


Bref, merci pour la solution sa fonction maintenant !


Cette discussion est classée dans : string, ifstream, getid, account, logincheck


Répondre à ce message

Sujets en rapport avec ce message

ifstream, ofstream, string? [ par Ultimate_VersuS ] 'Soir, je voudrais bien utiliser un string plutot qu'un char avec un objet ifstream ou ofstream. C'est possible? J'ai le vague sentiment que non (en t pb avec les string !!! [ par ElectricalMan ] slt,j'ai qqs "erreurs" à la compilation ! c à s'arracher les cheveux, pouvez vous m'aider svp : #include  #include #include using namespace std;< Class String VC++ [ par keos31 ] Comment fait-on pour modifier une class String avec un tabl Problème Base de Données Bilbio de Classe [ par Maiku ] SalutJe débute en C++ mais en BTS j'ai travaillé sur du C#, et j'avais fait une bibliothèque de classe avec plein de fonctions sur les bases de donnée Remplacer dans une string dans Dev-cpp [ par sebastienmz ] Bonjour j'ai une variable char qui contient un chemin d'accès au disque et j'aimerais que quand je fait : ".." sa supprime le dernier dossier rentrer renvoyer un system string [ par secalex ] Bonjour,Je suis entrain de devlopper une petite interface qui effectue des calculs à partir d'une valeur récupérée d'une textbox.Je récupère ma valeur Split d'une string [ par sebastienmz ] Bonjour j'ai une string qui contien la date dans ce format : Fri Nov 17 11:43:56 2006 et j'aimeraismettre chaque partie dans une char différente par e Problème de compilation [ par killer75 ] Voici donc mon pb:helpers.h #ifndef _HELPERS_H# define _HELPERS_H#include long strToLong(std::string const &a, int b);long strToLongDef(std::stri Mise en forme d'un String^ [ par eagleseyes ] BonjourJe cherche la méthode C++ équivalente à sprintf en C pour mettre en forme un String^. En gros je veux mettre la valeur hexadécimale d'un variab gestion de dictionnaire pour motus [ par neptalior ] Bonjour !Je programme un jeu motus ultra basique pour mon projet de mathjs info (chui en école d'ingé) et je souhaiterai savoir comment gérer des dico


Nos sponsors


Sondage...

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 : 4,368 sec (3)

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