Détecter si une chaine de caractère est vide [Résolu]

cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 25 sept. 2011 à 18:40 - Dernière réponse : cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention
- 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?
Afficher la suite 

Votre réponse

12 réponses

cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscription 21 mai 2018 Dernière intervention - 26 sept. 2011 à 12:23
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cptpingu
cs_LA_Tupac 305 Messages postés jeudi 29 avril 2004Date d'inscription 18 janvier 2012 Dernière intervention - 25 sept. 2011 à 20:34
0
Utile
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()
Commenter la réponse de cs_LA_Tupac
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 25 sept. 2011 à 21:04
0
Utile
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...
Commenter la réponse de cs_snake57
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscription 21 mai 2018 Dernière intervention - 25 sept. 2011 à 23:46
0
Utile
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
Commenter la réponse de cptpingu
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 26 sept. 2011 à 00:20
0
Utile
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.
Commenter la réponse de cs_snake57
cs_LA_Tupac 305 Messages postés jeudi 29 avril 2004Date d'inscription 18 janvier 2012 Dernière intervention - 26 sept. 2011 à 01:21
0
Utile
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 ...
Commenter la réponse de cs_LA_Tupac
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscription 21 mai 2018 Dernière intervention - 26 sept. 2011 à 01:29
0
Utile
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
Commenter la réponse de cptpingu
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 26 sept. 2011 à 01:53
0
Utile
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
Commenter la réponse de cs_snake57
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 26 sept. 2011 à 01:59
0
Utile
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.
Commenter la réponse de cs_snake57
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscription 21 mai 2018 Dernière intervention - 26 sept. 2011 à 10:36
0
Utile
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
Commenter la réponse de cptpingu
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 26 sept. 2011 à 12:09
0
Utile
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.
Commenter la réponse de cs_snake57
cs_snake57 204 Messages postés vendredi 19 novembre 2004Date d'inscription 1 novembre 2011 Dernière intervention - 26 sept. 2011 à 12:53
0
Utile
Effectivement avec \r ça fonctionne.

Merci pour ton aide.
Commenter la réponse de cs_snake57

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.