Traduction dans Visual C++

Résolu/Fermé
Nico@22 Messages postés 4 Date d'inscription mercredi 30 avril 2008 Statut Membre Dernière intervention 1 mai 2008 - 30 avril 2008 à 18:56
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 - 1 mai 2008 à 17:33
Bonjour,
j'ai un petit problème dans un programme en langage C,
on m'a donné des pistes mais avec des mots pour visual C++ express, disposant de visual C++ je n'arrive pas à compiler correctement. Il s'agit d'une fonction qui me permet de modifier une ligne dans un fichier texte.
Comment puis-je remplacer, pour que ceci fonctionne correctement :

std::string Buffer = ""; //Variable contenant le texte à réécrire dans le fichier
std::ifstream ReadFile( File);
if (ReadFile) //Si le fichier est trouvé
{
std::string line;
int Line = 0;
while ( std::getline( ReadFile, line ) ) //on parcours le fichier et on initialise line à la ligne actuelle
{
Line++;
if(Line == Line_to_Modify) //Si la ligne atteinte est différente de la ligne à supprimer...
{
line = ligne;
Buffer += line + "\n"; //ligne modifiée
}
else
{
Buffer += line + "\n"; //On ajoute le contenu de la ligne dans le contenu à réécrire
}
}
}
ReadFile.close(); //On ferme le fichier en lecture

std::ofstream WriteFile( File ); //On ouvre ce même fichier en écriture
WriteFile << Buffer; //On écrit le texte dedans
WriteFile.close(); //et on ferme le fichier

Merci d'avance pour vos réponses et d'avoir pris sur votre temps.
A voir également:

6 réponses

Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
30 avril 2008 à 19:52
Bonjour,

C'est un C++ tout ce qu'il y a de plus standard donc ce n'est pas un problème d'éditeur.

Par contre... nommer ses variables line, Line, ligne et Line_to_Modify donne une clarté reprochable.

if (ReadFile) //Si le fichier est trouvé
->
if ( ReadFile.is_open() )


L'idée parait être la bonne, qu'est-ce qui ne fonctionne pas exactement ?


M.

ps: Il y a des balises pour garder l'indentation du code ;)
0
Nico@22 Messages postés 4 Date d'inscription mercredi 30 avril 2008 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 14:48
en fait moi je débute en C et je ne connais donc pas des trucs comme std ofsream cout et j'aurais voulu savoir si on ne pouvait pas les remplacer par des fonctions plus simples (exemple: fgets fcolse fprintf...)
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
1 mai 2008 à 15:12
Si, on peut parfaitement.

ifstream (input file stream) et ofstream (output file stream) sont les équivalents C++ du FILE * en C.

M.
0
Nico@22 Messages postés 4 Date d'inscription mercredi 30 avril 2008 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 15:33
En faite, sa nous donne: fopen et fclose ?
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
1 mai 2008 à 16:23
Oui, en quelques sorte.

en C:
#include <stdlib.h>
#include <stdio.h>

FILE *pMyFile = NULL;

pMyFile = fopen( "monFichier.txt", "r" ); // r = read

if ( pMyFile != NULL ) // ouverture ok.
{
   while( fgets( ... ) != NULL )
   {
      ...
   }

   fclose( pMyFile );
}


en C++:
#include <string>
#include <fstream>

std::ifstream myFile;

myFile.open( "monFichier.txt" );

if ( myFile.is_open() )
{
   while( myFile.getLine( ... ) )
   {
      ...
   }

   myFile.close();
}


Rien n'empêche de le faire en C si c'est ta préférence.

En somme, ifstream représente un FILE * spécialisé pour la lecture et ofstream un FILE * spécialisé pour l'écriture.

La méthode que j'appliquerais est la suivante :

1) Lecture totale du fichier.
2) Modification de la ligne lue dans le tampon mémoire.
3) Ré-écriture complète.

Si le fichier est très gros ça peut être dommage de le lire en entier pour une ligne à changer.
Par contre si on veut remplacer par une ligne plus longue on est plus ou moins obligé.

Pour une lecture complète et rapide (tout le fichier en une seule lecture) tu peux t'inspirer de ceci ("Snippet" sur cppFrance.fr)
Le fichier est ouvert, le curseur de lecture est déplacé à la fin, la position du curseur est récupérée dans une variable pour mémoriser le nombre d'octets du fichier puis le curseur est replacé au début pour la lecture qui va suivre. C'est un bon moyen pour connaître la taille du fichier pour pouvoir allouer un tampon approprié pour la lecture.

oups, j'allais oublier. Pour l'exploitation du tampon, strtok (sur MSDN.microsoft.com) est une fonction magique. ^^ C'est une fonction standard de string.h. Idéale ici pour retrouver facilement les lignes une à une.

Ainsi je ferais:
1) Lecture complète. (et fermeture)
2) parcours des lignes lues en recopiant les premières lignes dans le fichier.
3) création de la nouvelle ligne et écriture.
4) parcours du reste en recopiant jusqu'à la fin.

Ce qui au final fait quand même un traitement assez lourd. Il vaut mieux éviter de le faire en boucle si on veut modifier plusieurs lignes et adopter une structures plus performante surtout...

M.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Nico@22 Messages postés 4 Date d'inscription mercredi 30 avril 2008 Statut Membre Dernière intervention 1 mai 2008
1 mai 2008 à 17:00
De ce que tu viens de dire, j'ai pu remplacer certains éléments.
Pour celle-ci : while ( std::getline( ReadFile, line ) ) //on parcours le fichier et on initialise line à la ligne actuelle
je l'ai remplacé par: while (fgets(line, 1000, ReadFile))
J'ai mis 1000 au hasard, et la compilation s'arrête par une "fatal error" à cette ligne.
0
Mahmah Messages postés 496 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 22 juin 2010 125
1 mai 2008 à 17:33
fgets ;-)

M.
0