Page 1 sur 1

stage prog

MessagePosté: 29 Mai 2009, 17:38
de kevinklein
Bonjour Monsieur Lelore,

Ouf j'ai quand meme reussi à avoir une ptite tache en prog , j'ai galéré pour l'avoir , mais ne rejouissons pas trop vite.

En fait on m'a demandé de programmer en c++ une fonction qui permettrait de supprimer les caracteres LF (Line Feed = Saut de ligne) et remplacer par un espace dans un fichier.
L'inconvenient c'est que je ne peux pas verifier si le caractere a bien été supprimé. Il faut que je fasse verifier par le developpeur car c'est un fichier special mais actuellement il n'est pas là.

Dites moi ce que vous pensez de ca mais je suis pas sûr du tout .

Code: Tout sélectionner
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
ifstream fichier("test.txt",ios_base::in);
string ligne;
getline(fichier,ligne);
while(!fichier.eof()){

if(ligne=="/n")
{
   cout<<" "<<endl;
}else{
   cout<<ligne<<endl;
}
getline(fichier,ligne);
}
fichier.close();
return 0;

}


Merci d'avance

Re: stage prog

MessagePosté: 29 Mai 2009, 19:33
de Tibo
C'est presque bon (l'idée est bonne), mais y'a beaucoup plus simple !

En effet, getline récupère une ligne du fichier texte... Mais qu'est ce que ça veut dire en réalité ? Ca veut dire que la fonction va récupérer tous les caractères jusqu'au caractère LF. Donc tu a résolut ton problème puisque tu auras dans ligne tous les caractères sauf le caractère LF ! Donc tu n'as pas besoin de tester que ta ligne est égale au caractère LF, puisque getline l'aura enlevé ;) !

Par contre, au lieu d'afficher les lignes à l'écran avec un cout, tu devrais les enregistrer dans un autre fichier ! Et tu pourras tester du coup que le caractère a bien été supprimé : si dans le fichier de destination tu n'as plus qu'une ligne, c'est bien que le caractère saut de ligne a été enlevé...
A toi de tester avec 2-3 fichiers textes (l'un avec une ligne, l'autre avec plein de lignes et un dernier avec plusieurs saut de lignes à la suite...)

Bon courage et reposte ton code !

Re: stage prog

MessagePosté: 03 Juin 2009, 11:01
de kevinklein
Merci Monsieur je pense avoir trouvé

J'ai fais comme vous m'avez dit

Toute fois j'ai remarqué plusieurs choses :
- la premiere ligne n'a pas été copié
- je pense que le reste a été copié puisque tout est à la suite
- le fichier 2 est plus léger (0,17Ko de difference) (mais je me suis dis que si j'utilise getline() forcement les sauts de ligne virent et du coup il y a moins d'octets).

Dites moi ce que vous en pensez

Merci.




Code: Tout sélectionner
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
ifstream fichier("test.txt",ios_base::in);
string ligne;
getline(fichier,ligne);
ofstream fichier1("test2.txt",ios_base::out);
while(!fichier.eof()){
getline(fichier,ligne);
fichier1<<ligne;
}
fichier.close();
fichier1.close();
return 0;
}


Re: stage prog

MessagePosté: 03 Juin 2009, 11:17
de kevinklein
INFO DERNIERE MINUTE

En fait j'avais mal compris , l'informaticien m'avait demandé d'enlever seulement
CR (caractère retour chariot) et non pas LF (les sauts de ligne).

J'étais étonné que ca soit simple :D .

Si vous avez une idée n'hésitez pas merci d'avance.

Re: stage prog

MessagePosté: 06 Juin 2009, 18:50
de N4th
cela va surement servir pour linux, car Les caractères de fin de ligne sont les suivants :
Sous Unix / Linux : 0x0A = LF = \n
et sous DOS / windows : 0x0D,0x0A = CRLF = \r\n

pour faire la correspondance il faut donc enlever les '\r' (CR)
ceci n'est pas si compliquer tu fais une boucle qui test chaque caractère d'une ligne :

Code: Tout sélectionner
while ( ligne[cpt]!='\r')
{
   cpt++;
}

ligne[cpt]='\n';


et donc au moment ou tu sort de la boucle, tu remplace ce fameux '\r' par '\n' par exemple..

PS : Attention au caractère, comme j'ai vue dans ton code précédant que tu à mis
(ligne=="/n") comme c'est un caractère il faut l'écrire comme ça : (ligne=='\n')

Re: stage prog

MessagePosté: 08 Juin 2009, 21:55
de Tibo
Comme le dit N4th, c'est sans doute un problème de compatibilité entre linux et windows...
Mais contrairement à ce que propose N4th, je ferai ça différemment :
La boucle qui est déjà faite est presque bonne (sauf pour la première ligne, mais tu devrais t'en sortir tout seul), c'est au moment d'écrire dans le nouveau fichier qu'il faut réfléchir à ce qu'il faut faire...

Si tu recopie la ligne bêtement, tu va aussi recopier \r\n :
Code: Tout sélectionner
fichier1<<ligne;

En effet, le dernier caractère de ligne est \r (le \n a été enlevé par le getline). Comme ligne est de type string, tu va pouvoir utiliser ces deux fonctions :
ligne.length() : ça te renverra le nombre de caractères de la ligne
ligne.substr(0,taille-1) : renvoit la ligne sans le dernier caractère... Avant de faire ça il faut penser à vérifier que le dernier caractère est bien égal à \r :
Code: Tout sélectionner
getline(fichier,ligne);
if(ligne[ligne.length()-1]=='\r'){
   ligne=ligne.substr(0,ligne.length()-1);
}
fichier1<<ligne;


J'espère qu'avec ça tu y arrivera !

Re: stage prog

MessagePosté: 21 Juin 2009, 20:23
de N4th
Ah oui effectivement c'est une bien meilleur solution ;) vous n'êtes pas prof pour rien! :p