IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Confusion entre les caratere '\n'et '\r'


Sujet :

C++

  1. #1
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut Confusion entre les caratere '\n'et '\r'
    Bonjour,

    Je lis les datas d'un fichier defini comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    1 12
    1 243
    3 88
    ...
    Avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    string a1,a2;
    FILE *f;    
    if ((f=fopen(data_file,"rt"))==NULL) throw Exception(error)
    do {
      strcpy(lig,"");
      fgets(lig,1999,f);
      if (sscanf(lig,"%d %d",&p,&a)==2) {
        a1.push_back(a);
        a2.push_back(p);
      }
    } while(!feof(f));
    Ca fonctionne si le fin de ligne est du type '\n' mais parfois les fichiers ont des fins de ligne de type '\r'. Et la le code ne voit qu'une ligne unique et ca ne fonctionne pas évidement.

    Auriez-vous une astuce pour que ca fonctionne dans tous les cas
    Merci d'avance de vos suggestions

  2. #2
    Membre averti Avatar de Dalini71
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2008
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2008
    Messages : 181
    Points : 343
    Points
    343
    Par défaut
    Bonjour,

    Le code que tu présentes c'est du C, et non du C++ (à part le throw), et ici c'est les forums C++, donc tu aurais peut-être plus de chance sur le forum approprié

    Pour une lecture de fichier en C++ tu peux regarder la FAQ.

    Et pour ton soucis de '\n' vs. '\r', tu peux regarder du coté de std::getline, y'a une version de celle-ci qui dispose d'un paramètre indiquant quel caractère doit être le délimiteur de ta ligne.

    En espérant t'avoir aidé.

  3. #3
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci de ta réponse et de ta suggestion, mais intialement je ne sais pas à l'avance quel caractére de fin de ligne, je vais trouver. En fait ca dépend sur quel OS le fichier a été créé

  4. #4
    Membre régulier Avatar de Jerome S
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2011
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2011
    Messages : 62
    Points : 89
    Points
    89
    Par défaut
    Est-ce qu'il y a obligatoirement plus d'une ligne ?
    Et selon l'OS c'est soit du \r soit du \n ?

    Si la réponse est oui a ces deux questions, tu parcours une première fois ton fichier, tu compte le nombre de \r et de \n. En comparant les deux valeurs, tu saura si tu dois regarder le \r ou le \n. Et ainsi, comme cela t'a été proposé, tu pourra utiliser le getline avec le caractère d'echappement qui va bien

  5. #5
    Membre averti Avatar de uriotcea
    Homme Profil pro
    Ingénieur / physicien
    Inscrit en
    Septembre 2003
    Messages
    1 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur / physicien
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 301
    Points : 444
    Points
    444
    Par défaut
    Merci pour tes suggestions, je vais essayer ca.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Le problème des flux en mode texte (au passage, note que le "t" ne fait pas partie du standard C: L'absence de "b" est suffisante pour indiquer qu'il s'agit d'un flux texte) est que ça ne marche bien que sur les fichiers où les retours à la ligne sont ceux prévus par la plate-forme (*n*x: \n - Ancien Mac: \r - Reste du monde: \r\n) : seuls ceux-ci seront automatiquement vus comme des \n par le programme.

    Ce qui cause des problèmes lorsqu'on se retrouve à bosser sur des fichiers d'une autre plate-forme. Dans ce cas, il sera sans doute mieux de bosser avec un flux binaire et de traiter les trois types de retour à la ligne toi-même.

Discussions similaires

  1. [Débutant] Confusion entre les panels en windows form ?
    Par hamza_azerty dans le forum C#
    Réponses: 3
    Dernier message: 09/09/2014, 23h00
  2. Confusion entre les entités et JPA
    Par Arget dans le forum JPA
    Réponses: 12
    Dernier message: 09/12/2011, 17h58
  3. Confusions entre les one/many-to-many/one
    Par TigrouMeow dans le forum Hibernate
    Réponses: 1
    Dernier message: 01/01/2007, 21h44
  4. Benchmark entre les langages
    Par El blérot dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 27/12/2002, 01h22
  5. Réponses: 3
    Dernier message: 07/05/2002, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo