Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gérer les espaces blancs dans la lecture d'un fichier texte

    28 mai 2008 à 8:58:36

    Salut,

    Alors voilà j'ai un fichier texte de cette forme :
    AncienneIP                NouvelleIP                MASK                        Passerelle
    
    
    192.6.6.89                255.255.255.255                255.255.255.0                192.6.6.10
    220.23.23.1                25.21.20.10                255.255.255.0                192.6.6.10
    223.1.0.212                192.6.6.89                 255.255.255.0                192.6.6.10
    123.21.20.5                23.25.65.47                255.255.255.0                192.6.6.10


    Voici mon algorithme de lecture du fichier :
    bool lireFichierConfig()
    {
    	ifstream fichier("config.txt",ios_base::in);
    	if(fichier)
    	{
    		string ligne;
    		while(!fichier.eof())
    		{
    			getline(fichier,ligne);
    			fichier >> ::ancienneIP >> ::nouvelleIP >> ::mask >> ::passerelle;
    			if(::ancienneIP==::ip)
    				break;
    		}
    		Color(10,0);
    		cout << "OK : IP trouve dans le fichier config.txt." << endl;
    		Color(15,0);
    		cout << "---------------------------------------------------------" << endl;
    		cout << "Ancienne IP de la machine : ";
    		Color(12,0);
    		cout << ::ancienneIP << endl;
    		Color(15,0);
    		cout << "Nouvelle IP de la machine : ";
    		Color(10,0);
    		cout << ::nouvelleIP << endl;
    		Color(15,0);
    		cout << "Mask de la machine : ";
    		Color(10,0);
    		cout << ::mask << endl;
    		Color(15,0);
    		cout << "Passerelle de la machine : ";
    		Color(10,0);
    		cout << ::passerelle << endl;
    		Color(15,0);
    		cout << "---------------------------------------------------------" << endl << endl;
    		return true;
    	}
    	else
    	{
    		Color(12,0);
    		cout << "Erreur : Impossible de trouver le fichier config.txt." << endl;
    		Color(15,0);
    		return false;
    	}
    }
    


    Or lorsque j'aqquiert les valeurs il me faut obligatoirement les 4 dans une ligne sinon toutes le données se retrouve décalées car le programme enleves les espaces vides.
    Ce programme a pour but de changer l'ip de la machine dont le nom "ancienneIP" se trouve dans le fichier texte par l'ip "nouvelleIP" ainsi que le MASK et la passerelle via la commande netsh.

    Imaginons qu'une machine n'est pas de passerelle ?
    Comment peut on faire pour que le programme gerre ligne par ligne et qu'il range juste un "espace" dans la variable ::passerelle si celle ci n'est pas mentionné dans le fichier ?

    J'aimerais aussi que le programme puisse gérer les lignes de commentaires. (Comme dans les fichiers hosts de windows a peut près) Si l'on met un #devant le programme ne prend pas en compte la ligne.

    Merci d'avance pour votre aide,
    ++

    Barbuslex.
    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2008 à 11:16:35

      Si ton format est modifiable, je peux te conseiller le XML, qui te sera surement plus pratique que ce genre de fichier !

      Tu obtiendrais ceci :

      <IP>
        <IP>
          <AncienneIP ip="192.6.6.89"/>
          <NouvelleIP ip="255.255.255.255"/>
          <MASK ip="255.255.255.0 "/>
          <Passerelle ip="192.6.6.10"/>
        </IP>
        <IP>
          <AncienneIP ip="220.23.23.1"/>
          <NouvelleIP ip="25.21.20.10"/>
          <MASK ip="255.255.255.0"/>
          <Passerelle ip="192.6.6.10"/>
        </IP>
        <IP>
          <AncienneIP ip="223.1.0.212"/>
          <NouvelleIP ip=""/>
          <MASK ip="255.255.255.0"/>
          <Passerelle ip="192.6.6.10"/>
        </IP>
        <IP>
          <AncienneIP ip="123.21.20.5"/>
          <NouvelleIP ip="23.25.65.47"/>
          <MASK ip="255.255.255.0"/>
          <Passerelle ip="192.6.6.10"/>
        </IP>
      </IP>
      


      Avec ce genre de format, tu peux très facilement lire ton fichier grâce à des parsers comme TinyXML

      Tu peux en plus utiliser les commentaires

      Plus besoin de gerer le nombres d'espaces
      Et si une variable n'est pas mentionnée, tu ne l'indique tout simplement pas ;)

      En esperant t'avoir aidé
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        28 mai 2008 à 12:37:22

        std::getline pour récupére dans des std::string des valeurs depuis un istream
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2008 à 13:04:20

          Les tests de lectures sont mauvais.

          Pour les commentaires, il suffirait de plugguer un streambuf filtrant les # dans le stream source (-> boost.io), ou, vu que tu lis ligne par ligne, après chaque ligne lue, tu peux la couper au premier #.

          Sinon, si tu peux avoir des champs vides, tu vas devoir faire évoluer ton format pour supporter cela. Par exemple en séparant les champs par des tabulations, ou des points-virgules, ...

          Euh ... l'XML c'est un peu une enclume. Il faut savoir faire simple parfois.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.

          Gérer les espaces blancs dans la lecture d'un fichier texte

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown