Traduction dans Visual C++
Résolu
Nico@22
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
-
Mahmah Messages postés 496 Date d'inscription Statut Membre Dernière intervention -
Mahmah Messages postés 496 Date d'inscription Statut Membre Dernière intervention -
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.
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:
- Traduction dans Visual C++
- Visual c++ 2019 - Guide
- Visual petanque - Télécharger - Sport
- Google traduction photo - Guide
- Visual paradigm - Télécharger - Gestion de données
- Visual watermark - Télécharger - Photo & Graphisme
6 réponses
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 ;)
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 ;)
Nico@22
Messages postés
4
Date d'inscription
Statut
Membre
Dernière intervention
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...)
Si, on peut parfaitement.
ifstream (input file stream) et ofstream (output file stream) sont les équivalents C++ du FILE * en C.
M.
ifstream (input file stream) et ofstream (output file stream) sont les équivalents C++ du FILE * en C.
M.
Oui, en quelques sorte.
en C:
en C++:
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.
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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.
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.