Ne pas lire une ligne lors de la lecture d'un fichier [Résolu]

Messages postés
15
Date d'inscription
lundi 21 novembre 2016
Statut
Membre
Dernière intervention
16 avril 2018
-
Bonjour,
j'aimerai savoir comment ne pas lire une ligne qui comme par un '#' dans un fichier .txt, voici mon code et une partie de mon fichier .txt
int main()
{

// string null1;

int lines = 0;


ifstream file("control_ressources.txt", ios::in);
if ( file )
{

while ( file.ignore( std::numeric_limits<int>::max(), '\n' ) ) //recuperation du nombre de ligne dans le fichier
{
++lines;
}
}

string * hostname = new string[lines]; //allocation dynamique de string*lines
string * parc = new string[lines];



ifstream fichier("control_ressources.txt", ios::in); // on ouvre en lecture

if(fichier)
{
for (int i = 0; i < lines; ++i)
{
fichier >> hostname [i] >> parc [i]; //lire et stocker l'ID pc dans hostname et le parc dans parc
cout << hostname[i]; // afficher les ID pc
cout << " ";
cout << parc[i]; // affciher les parcs correspondants
cout << '\n';
}


fichier.close();
}

else
cerr << "Impossible d'ouvrir le fichier !" << endl;


delete [] hostname;
delete [] parc;
return 0;
}


# Parc lt = parc_style=lt
# TEST DSIN
VVLT parc_style=lt
VVLT parc_style=lt
VVLT parc_style=l
VVLT parc_style=lt
VVLT14 parc_style=lt
# Parc af= parc_style=af
# a exploiter pour toutes conversion
VVC0RE parc_style=aft
VVC0RR parc_style=aft
Afficher la suite 

5 réponses

Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Bonjour.

Eh bien si ton premier caractère (hors espace) d'une ligne commence par #, tu ne lis pas la ligne, tout simplement...

Déjà, y a énormément de souci avec ton code ! Je vais essayer de les lister:
  • Évite les using namespace std, c'est ultra crade, voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
  • Un std::ifstream contient déjà l'option std::ios::in, donc pas besoin de la remettre.
  • Le fichier.close() est inutile, un stream se ferme déjà tout seul.
  • Pourquoi faire des new string[], alors que tu as la classe std::vector ?
  • Pourquoi compter le nombre de lignes du fichier, préallouer un tableau, puis le relire à nouveau ? Ça n'a pas de sens ! Tu le lis une seule fois en ajoutant ce qu'il faut... Donc plutôt utiliser: std::getline, std::vector (.push_back), et un seul std::ifstream.


Je te corrige ton code, et te laisse trouver comment éviter les "#" (facile si tu as compris l'explication):
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>

struct Info
{
  std::string hostname;
  std::string parc;
};

int main()
{
  std::ifstream file("control_ressources.txt");
  if (!file)
  {
    std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;
    return 1;
  }

  std::vector<Info> infos;
  std::string line;
  while (std::getline(file, line))
  {
    // Vérifier si line commence par un #
    Info info;
    std::istringstream buff(line);
    buff >> info.hostname >> info.parc;
    infos.push_back(info);
  }

  for (std::vector<Info>::iterator it = infos.begin(); it != infos.end(); ++it)
    std::cout << "host: " << it->hostname << ", parc: " << it->parc << std::endl;

  return 0;
}

Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
lundi 21 novembre 2016
Statut
Membre
Dernière intervention
16 avril 2018
0
Merci
if (line != "#")
{
  Info info;
  std::istringstream buff(line);
  buff >> info.hostname >> info.parc;
  infos.push_back(info);
}


t'en pense quoi?
Commenter la réponse de harris93
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Teste le, tu verras bien :).

(Que se passe-t-il si on met " # commentaire" au lieu de "# commentaire" ?).
Commenter la réponse de cptpingu
Messages postés
15
Date d'inscription
lundi 21 novembre 2016
Statut
Membre
Dernière intervention
16 avril 2018
0
Merci
il prend en compte de l'espace qui est devant le #?
Commenter la réponse de harris93
Messages postés
15
Date d'inscription
lundi 21 novembre 2016
Statut
Membre
Dernière intervention
16 avril 2018
0
Merci
if (line[0] != '#')
{
  Info info;
  std::istringstream buff(line);
  buff >> info.hostname >> info.parc;
  infos.push_back(info);
}


Ça marche quand je mets ce test,
merci beaucoup pour ton aide.
Commenter la réponse de harris93