Écrire après un mot précis dans un fichier texte

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 883 fois - Téléchargée 30 fois

Contenu du snippet

Ce morceau de code permet d'écrire à un endroit précis dans un fichier texte.
Par exemple, si j'ai le fichier texte date.txt suivant :

JOUR 13
MOIS 06
ANNEE 2004

et que je veux changer le mois par exemple, alors j'appelle la fonction ajout :
ajout("07","date.txt","MOIS")

et je récupère dans date.txt :

JOUR 13
MOIS 07
ANNEE 2004

Source / Exemple :


#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <windows.h>
using namespace std; 

int nombre_lignes(int indice,LPCTSTR f){//retourne le nombre de lignes avant le mot recherche
	ifstream fic(f);
	if(!fic){
	          cerr<<"le fichier ne peut pas etre ouvert."<<endl;
	          exit(EXIT_FAILURE);
	           }
	char ch;
	unsigned int nb_char =0;
	string texte;
	int nb_lignes_debut=0;
	while(fic.get(ch)&& nb_char <=indice){
		texte +=ch;nb_char++;
		if(ch=='\n'){++nb_lignes_debut;}
		}
	return(nb_lignes_debut);
	}

int chercher(LPCTSTR f,string expr){//retourne l'endroit où on va ecrire dans le fichier
	ifstream fic(f);
	if(!fic){
		cerr<<"le fichier ne peut pas etre ouvert."<<endl;
		exit(EXIT_FAILURE);
		}
	char ch;
	string texte;
	int nb_lignes=1;//, nb de lignes du fichier, =1 a cause du eof
	while(fic.get(ch)){
		texte +=ch;
		if(ch=='\n'){++nb_lignes;}
		}
	int indice;
	indice=texte.find(expr);
	char *debut=new char(indice+1);
	fic.read(debut,indice);
	int nb_lignes_debut=nombre_lignes(indice,f);
	return (indice+nb_lignes_debut+expr.length()+1);
	}

void ajout(string s,LPCTSTR f,string expr){//ecrit dans le fichier a l'emplacement desire
	fstream fic(f,ios::in|ios::out);
	if(!fic){
		cerr<<"le fichier ne peut pas etre ouvert."<<endl;
		exit(EXIT_FAILURE);
		}
	int i;
	i=chercher(f,expr);
	fic.flush();
	fic.seekg(i,ios::beg);
	fic<<s;
	fic.flush();
	fic.close();
	}

Conclusion :


L'intérêt de cette fonction apparemment très simple est qu'il n'est pas évident de penser à compter les lignes avant celle où l'on veut écrire. Mais si on ne le fait pas, comme le saut de ligne compte pour 2 caractères, ce qu'on veut ecrire s'écrit trop tôt !

N'hésitez pas à me donner votre avis...

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
meme rqs que précédemment

Si tu veux utiliser des données dans un fichier, utilise des fichiers ini ou gère les comme tels

aide : http://www.cppfrance.com/code.aspx?ID=18784

magicalement, @+
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
cerr<<"le fichier ne peut pas etre ouvert."<<endl; le endl est inutile (aucun effet), cerr n'est pas buffferisée

fic.flush();
fic.close(); inutile, ca flush et ca close tout seul lors de la destruction

si tu ne flush pas dans un but precis, ca fou en l'air les performance (a quoi ca sert les e/s bufferisée ? )

sinon mem remarque que BruNews, fait attention a ne pas tout melanger
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Salut,

que vient faire #include <windows.h> ici ?
Les flux sont obsoletes sur Windows qui a une API complete pour les fichiers et le reste.
Faut faire un code coherent, soit flux et reflux, soit Windows.

ciao...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.