cs_jfrancois
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
2
22 avril 2008 à 12:37
Bonjour,
Voici un essai commenté en C/C++ (sous Visual C++ 6.0) qui peut être utilisé directement ou servir de base. Le fichier à modifier est passé en paramètre et doit se trouver dans le répertoire courant et ne pas faire plus de 64Koctets (modifiable dans le programme). Le fichier modifié est créé dans le répertoire K:\TEST avec le même nom :
#include <stdio.h>
int main(int argc,char** argv)
{
// --- Constantes
static const int iPositionInsertion = 24; // devant cette virgule
static const char* szInsertion = "TEST";
static const int iLongueurInsertion = strlen(szInsertion);
static const char* szRepertoire = "K:\\TEST\";
// --- Buffer de lecture du fichier
static const int iTailleBuffer = 64 * 1024; // taille maxi
char acBuffer[iTailleBuffer];
// --- Présentation et contrôle du paramètre
printf("\nMODIFICATION D'UN FICHIER\n");
if (argc != 2)
{
printf("Utilisation: test nom_du_fichier\n");
printf("Le fichier a modifier "nom_du_fichier" doit etre dans le repertoire courant\n");
printf("Le fichier modifie "nom_du_fichier" est cree dans le repertoire "%s"\n",szRepertoire);
return 0;
}
// --- Ouvrir/lire/fermer le fichier en entrée
printf("Lecture du fichier %s\n",argv[1]);
FILE* fp = fopen(argv[1],"rt");
if (fp == NULL)
{
printf("*** Erreur a l'ouverture du fichier ***\n");
return 0;
}
int iTailleFichier = fread(acBuffer,1,iTailleBuffer,fp);
fclose(fp);
printf("- %d caracteres lus dans %s\n",iTailleFichier,argv[1]);
// --- Traiter le buffer
int iCompteurVirgule = 0;
for (int i=0 ; i
// --- 1) Décaler de "iLongueurInsertion" caractères
for (int j=iTailleFichier ; j>=i ; --j)
acBuffer[j + iLongueurInsertion] = acBuffer[j];
// --- 2) Insérer le texte
strncpy(&acBuffer[i],szInsertion,iLongueurInsertion);
// --- 3) Traitement du buffer terminé
iTailleFichier += iLongueurInsertion;
break;
}
}
}
if (iCompteurVirgule < iPositionInsertion)
{
printf("*** Fichier non modifie ***\n");
return 0;
}
// --- Nom complet du fichier en sortie
char szNomFichier[MAX_PATH];
strcpy(szNomFichier,szRepertoire);
strcat(szNomFichier,argv[1]);
// --- Ouvrir/écrire/fermer le fichier en sortie
printf("Ecriture du fichier %s\n",szNomFichier);
fp = fopen(szNomFichier,"wt");
if (fp == NULL)
{
printf("*** Erreur a l'ouverture du fichier ***\n");
return 0;
}
fwrite(acBuffer,iTailleFichier,1,fp);
fclose(fp);
printf("- %d caracteres ecris dans %s\n",iTailleFichier,szNomFichier);
return 0;
}
Ce qui donne :
C:\Temp\test test.txt
MODIFICATION D'UN FICHIER
Lecture du fichier test.txt
- 83 caracteres lus dans test.txt
Insertion de "TEST" devant la virgule 24
Ecriture du fichier K:\TEST\test.txt
- 87 caracteres ecris dans K:\TEST\test.txt
Fichier test.txt :
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,avant 23,,apres 24,0,1,2,3,4,5,6,7,8,9
Fichier K:\TEST\test.txt :
a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,avant 23,TEST,apres 24,0,1,2,3,4,5,6,7,8,9
Jean-François