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
Et également avec un FILE *
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
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
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
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
Partager