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

harris93 15 Messages postés lundi 21 novembre 2016Date d'inscription 16 avril 2018 Dernière intervention - 26 janv. 2017 à 10:35 - Dernière réponse : harris93 15 Messages postés lundi 21 novembre 2016Date d'inscription 16 avril 2018 Dernière intervention
- 26 janv. 2017 à 14:19
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

Répondre au sujet
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 26 janv. 2017 à 11:18
0
Utile
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
harris93 15 Messages postés lundi 21 novembre 2016Date d'inscription 16 avril 2018 Dernière intervention - Modifié par cptpingu le 26/01/2017 à 12:09
0
Utile
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
cptpingu 3784 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 18 avril 2018 Dernière intervention - 26 janv. 2017 à 11:47
0
Utile
Teste le, tu verras bien :).

(Que se passe-t-il si on met " # commentaire" au lieu de "# commentaire" ?).
Commenter la réponse de cptpingu
harris93 15 Messages postés lundi 21 novembre 2016Date d'inscription 16 avril 2018 Dernière intervention - 26 janv. 2017 à 11:57
0
Utile
il prend en compte de l'espace qui est devant le #?
Commenter la réponse de harris93
harris93 15 Messages postés lundi 21 novembre 2016Date d'inscription 16 avril 2018 Dernière intervention - Modifié par cptpingu le 26/01/2017 à 15:50
0
Utile
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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.