logo

stage prog

C'est ici que vous posterez vos questions sur la programmation en C ou en C++

stage prog

Messagede kevinklein » 29 Mai 2009, 17:38

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
kevinklein
 

Re: stage prog

Messagede Tibo » 29 Mai 2009, 19:33

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 !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: stage prog

Messagede kevinklein » 03 Juin 2009, 11:01

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;
}

kevinklein
 
Messages: 4
Inscription: 29 Mai 2009, 17:40

Re: stage prog

Messagede kevinklein » 03 Juin 2009, 11:17

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.
kevinklein
 
Messages: 4
Inscription: 29 Mai 2009, 17:40

Re: stage prog

Messagede N4th » 06 Juin 2009, 18:50

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')
N4th
 
Messages: 14
Inscription: 28 Mar 2008, 23:30

Re: stage prog

Messagede Tibo » 08 Juin 2009, 21:55

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 !
Tibo
Administrateur du site
 
Messages: 147
Inscription: 26 Mar 2008, 13:58

Re: stage prog

Messagede N4th » 21 Juin 2009, 20:23

Ah oui effectivement c'est une bien meilleur solution ;) vous n'êtes pas prof pour rien! :p
N4th
 
Messages: 14
Inscription: 28 Mar 2008, 23:30


Retourner vers Cpp

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités

cron
Hit-Parade des sites francophones