Détecter si une chaine de caractère est vide

Résolu
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011 - 25 sept. 2011 à 18:40
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011 - 26 sept. 2011 à 12:53
Bonjour à tous,

Alors je suis en c++ et je lis une à une toute les lignes d'un fichier texte.

Je range la ligne lue dans la variable "lignecourante". Ma variable lignecourante est un string.

J'aimerais pourvoir faire une action lorsque la ligne lue est vide.

J'ai donc essayer ceci : if(ligneCourante=="")

Mais le if n'est jamais validé.

Quelqu'un pourait m'aider?

12 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 sept. 2011 à 12:23
C'est effectivement dû à un différence de format.

Sous Unix, une fin de fichier c'est \n.
Sous Windows une fin de fichier c'est \r\n.
Il me semble que sous Mac c'est \r (pas sur que ça soit encore le cas).
Enfin c'est le bordel.

Donc tu peux tester: ligneCourante[0] == '\r'.
("^M" c'est un sigle, donc c'est deux caractères pour dire qu'il n'y en qu'un. Comme "NULL" qui veut dire 0, pour vulgariser).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 1
25 sept. 2011 à 20:34
Salut! la std a prévu ce cas de figure comme un tas d'autres et c'est en grande partie grace à elle que j'adore ce code

std::string.empty()
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
25 sept. 2011 à 21:04
Je viens de tester chez moi et ça ne marche pas.

Voila le bout de code concerné :

        ifstream fichierGC(nomFichierGC.c_str(), ios::in);  // on ouvre le fichier en lecture

        if(fichierGC)  // si l'ouverture a réussi
        {       
                while(not fichierGC.eof())  // tant qu'on est pas à la fin du fichier
        {
        	nbrLigneGC++; // on compte le nombre de ligne du fichier
        	getline(fichierGC, ligneCourante); //on met la ligne dans la variable intermédiaire
        	if(ligneCourante.empty())
        	{
        		cout << "ligne " << nbrLigneGC;
        	}
        	contenuFichierGC.push_back(ligneCourante); // On ajoute une ligne dans le tableau de string et on y range la ligne du fichier texte qui vient d'être lue
      	}
      	
                fichierGC.close();  // on ferme le fichier
        }
        else  // sinon
                cerr << "Impossible d'ouvrir le fichier " << nomFichierGC << " !" << endl;


Je ne passe jamais dans mon if pourtant le fichier texte contient bien des lignes vides...
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 sept. 2011 à 23:46
Plusieurs remarques:
- Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace
- std::ios::in est inutile, car tu utilise un std::ifstream (l'option est alors implicite).
- while(not fichierGC.eof()) => utilise "!" et non "not". De plus un simple "while (fichierGC)" suffit.
- ligneCourante == "" et ligneCourante.empty() donne le même résultat, mais il est plus élégant de marquer ligneCourante.empty()
- fichierGC.close() => Non nécessaire, puisque le fichier se fermera tout seul à la destruction de l'objet de type std::ifstream (principe du RAII).

Aucun problème avec ceci:
#include 
#include <fstream>

int main()
{
  std::ifstream file("test");

  int nb = 0;
  std::string line;
  while (file)
  {
    std::getline(file, line);
    ++nb;
    if (line.empty())
      std::cout << " " << line << std::endl;
    else
      std::cout << line << std::endl;
  }

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
26 sept. 2011 à 00:20
Alors déjà un grand merci pour tous les conseils que tu m'a donné, je suis preneur de toute ces petites choses ;)

J'en profite pour te demander une petite précision, tu dis que le fichier se ferme tous seul lorsque l'objet est détruit, mais peux tu me dire a quel moment l'objet est détruit?

Bon sinon j'en reviens à mon problème. Apparemment tu as l'air de me dire que mon code est bon avec mon if(ligneCourante.empty()) pourtant le fichier texte que je lis contient plusieurs lignes vides et le if en question n'est jamais validé (je ne passe pas dedans). Je ne comprends donc pas d'où vient le problème.
0
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 1
26 sept. 2011 à 01:21
Pour la destruction, tout dépend de ton code, si elle fait partie d'un autre objet elle est détruite quand il l'est, ou en fin de fonction si elle est crée dedans...
Pour ton soucis, essaye d'afficher les lignes à chaque boucle pour voir si elles sont effectivement vides....
std::cout<<"ligne:"<<ligneCourante<<":\n";

Si tu obtiens "ligne: :" c'est qu'il y'a un espace ...
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 sept. 2011 à 01:29
peux tu me dire a quel moment l'objet est détruit?

Un objet vie dans un "scope".

Quelques exemples:
int func()
{
  Class obj; // Création
  // code

  return 0; // obj est détruit après le return
}


void func()
{
  Class pouet; // Création pouet

  {
    Class obj; // Création obj
    // code
  } // obj est détruit

  // code

  // Destruction pouet
}


Il est effectivement possible que tu aies des caractères invisibles (espace, tabulation, saut de ligne, ...) ou non affichables (généralement dû à un encoding mal supporté).

Fais donc voir le contenu du fichier en question.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
26 sept. 2011 à 01:53
Je viens de trouver mon soucis. Mon fichier est dans un format peu courant, il à été enregistré sur OS/2 un vieil OS qui n'existe plus...

Donc une ligne vide n'est pas considérée comme tel car le codage du fichier n'est pas standard.

Et la je bloque à nouveau
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
26 sept. 2011 à 01:59
CptPingu c'est exactement ça, j'avais pas vu que tu avais répondu.

Le problème je peux pas vous faire voir mon fichier car si je le copie/colle ici on verra effectivement des lignes vides et pas autre chose.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 sept. 2011 à 10:36
2 solutions:
- Tu changes l'encodage du fichier via notepad++(Windows) ou emacs (Linux). Tu peux aussi voir les caractères spéciaux en tapant un "cat -A ton_fichier"
- Si tu dois le lire tel quel, alors repère le caractère de délimitation, et lis caractère par caractère. À toi de séparer "à la main", les différentes phrases.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
26 sept. 2011 à 12:09
En affichant avec CAT on voit en effet que toutes mes lignes vides contiennent ceci "^M". D'ailleurs toutes les lignes se terminent par ça aussi.
Ca doit être le retour charriot.

Enfin bref j'ai donc essayé ceci : if(ligneCourante[0]=='^'&&ligneCourante[1]=='M')
Dans le doute j'ai essayé ça aussi : if(ligneCourante[0]=='^M')

Mais ça ne fonctionne pas.
0
cs_snake57 Messages postés 204 Date d'inscription vendredi 19 novembre 2004 Statut Membre Dernière intervention 1 novembre 2011
26 sept. 2011 à 12:53
Effectivement avec \r ça fonctionne.

Merci pour ton aide.
0
Rejoignez-nous