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 :

Retour à la ligne CR-LF/LF sous Windows + GCC


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut Retour à la ligne CR-LF/LF sous Windows + GCC
    Bonjour à tous

    J'ai installé MinGW sur un poste sous Windows, et je suis confronté à un problème cornélien.

    J'ai une série de fichiers que je dois traiter très rapidement (d'où le choix de C/C++ par rapport à C# que je maitrise mieux, mes cours de C/C++ datent, et n'étaient pas très avancés, c'était plus de la méthode de développement que l'apprentissage d'un langage)

    Le but est de retirer toutes les lignes vides de ces fichiers (sachant qu'il risque y avoir d'autres traitements plus tard, mais pour le moment je me concentre là dessus).

    En entrée, j'ai des fichiers issus de systèmes d'informations Un*x ou Windows, où les fins de lignes ne sont pas codées de la même manière (CR-LF pour les systèmes Windows, LF seul pour les systèmes Un*x)

    Sachant que je ne peux pas demander à tous mes clients de changer leurs fichiers (j'optimise de l'existant, et leur faire changer coûterais trop cher et serait trop long), que mon programme tourne sous Windows, et qu'il faut que je respecte le format de fichier original sans les lignes vides, je me suis dit "Tiens, je vais faire un petit programme en C qui va lire un fichier ligne par ligne, puis le réécrire dans un autre fichier en ignorant les lignes vides"

    Seulement dans ma tête, '\n' était l'octet LF et '\r' l'octet CR. Donc je me suis dit : "Dans un premier temps, je réécris mes lignes avec endl, puis ensuite, je ferais une détection du caractère de fin de fichier, et j'aviserais en fonction"...

    Sauf que grave erreur de ma part, je ne savait pas que '\n'... c'est CR-LF sous Windows...

    Ma question est "simple"... comment je peux faire pour écrire dans un fichier un caractère LF sans CR ?

    J'ai tenté avec un ofstream
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ofstream outFile ("mon-fichier.txt");
    outFile << buffer << endl; // CR-LF
    outFile << buffer << '\n'; // CR-LF
    outFile << buffer << (char)10; // CR-LF << celui là m'étonne
    Et également avec un FILE *

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FILE *outPtr = fopen("mon-fichier.txt", "w");
    unsigned char *eol = (unsigned char *) malloc (2 * sizeof(char));
    eol[0] = 10;
    eol[1] = '\0';
     
    fwrite(buffer.c_str(), 1, buffer.size(), outPtr);
    fwrite(eol, 1, 1, outPtr); // CR-LF << Je suis étonné également
    Une fois que j'aurais compris comment écrire un LF seul, je pourrais continuer en détectant mon caractère de fin de fichier, pour le moment, je bloque là dessus... chaque problème en son temps

    Bien entendu, le code ci dessus est très sale, le vrai code gère les erreurs d'ouverture de fichiers, les pointeurs alloués à NULL, les fermeture de fichiers et la libération des pointeurs

  2. #2
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Mettre ton fichier au format binaire ira ?

  3. #3
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Si au final mon fichier est correct, oui, mais le mode "b" n'est pas ignoré dans gcc > 3 ?

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Que nenni ! En c++ : std::ofstream file("File_Name",std::ios_base::binary);

    Et oui, ça marche. J'ai déjà essayer d'écrire une image en mode texte, les résultats étaient spectaculaire >< !

  5. #5
    Membre éclairé Avatar de mioux
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2005
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2005
    Messages : 369
    Par défaut
    Merci, c'est génial...

    un simple "wb" et c'était réglé :'(

    La prochaine fois, je teste avant de croire ce que je lis sur le net

    (oui j'ai pas trop l'habitude d'utiliser les ofstream, pour dire, j'ai découvert la classe string en regardant la FAQ... en cours on nous avait fait développer une classe lstring basée sur du char * pour créer notre propre chaine de caractère... et on n'utilisais que du FILE * pour manipuler des fichiers ^^)

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par mioux Voir le message
    Merci, c'est génial...

    un simple "wb" et c'était réglé :'(

    La prochaine fois, je teste avant de croire ce que je lis sur le net

    (oui j'ai pas trop l'habitude d'utiliser les ofstream, pour dire, j'ai découvert la classe string en regardant la FAQ... en cours on nous avait fait développer une classe lstring basée sur du char * pour créer notre propre chaine de caractère... et on n'utilisais que du FILE * pour manipuler des fichiers ^^)
    Voilà bien de très mauvais cours, qui sont, malheureusement, trop fréquents...

    Je ne dis pas qu'il n'est pas intéressant de demander aux élèves d'implémenter une classe string "personnelle", car cela permet d'aborder certains détails, mais, par contre, le fait de ne parler ni de la classe std::string ni des flux (en générale) ni des fichiers (en particuliers) me semble... peu engageant pour l'avenir.

    A l'heure actuelle, on en est à une situation dans laquelle les gens prennent de plus en plus conscience du fait que, bien que C++ descende en droite ligne de C, il s'agit, malgré tout, d'un langage tout à fait distinct, pour lequel une grande partie des possibilités issues de son "ancêtre" le C sont à éviter autant que possible.

    Aussi, si je n'avais qu'un seul conseil à te donner, ce serait bien de te "ruer" sur la FAQ, et de la lire attentivement, d'abandonner les pratiques issues du C et de t'intéresser à ce que C++ peut t'offrir, que ce soit au niveau des flux (de manière générale), de la classe string ou des collections d'objets...

    Tu verra, cela te simplifiera énormément la vie et te permettra de fournir un travail bien meilleur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2014, 10h47
  2. Réponses: 4
    Dernier message: 29/05/2012, 23h27
  3. Retour a ligne du texte de mon menu sous ie6
    Par dedel53 dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 14/05/2007, 15h24
  4. [MySQL] Retour à la ligne est traduit par rn sous mysql
    Par vandeyy dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 08/03/2007, 12h17
  5. Désactiver le retour à la ligne après un hr sous IE6
    Par Le_MaLaDe dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 30/11/2006, 14h45

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