#define TAILLE_MAX 300000 // la taille maximum d'un fichier ( aproximatif, si tu doit faire ca avec un + gros prgm, agrandit et tout le reste te suivra) #include #include #include //La fonction remplace effectue un remplacement, dans une chaine, d'une sous-chaine par une autre. //Il faut que la sous-chaine de remplacement soit de même longueur que la sous-chaine à remplacer. //Les tailles des chaînes doivent être indiqué (cela évite d'avoir à inclure string.h) void remplace(char* chaine, const int tailleChaine, const char* from, const char* to, const int tailleRemplacement) { int i = 0, j = 0, ok = 0; while (i < tailleChaine - tailleRemplacement) { if (chaine[i] == from[0]) { ok = 1; j = 0; while (ok && j < tailleRemplacement) { if (chaine[i+j] != from[j]) { ok = 0; } j++; } if (ok) { for (j = 0; j < tailleRemplacement; j++) { chaine[i+j] = to[j]; } i += tailleRemplacement - 1; } } i++; } } void clean(const char *buffer, FILE *fp) { char *p = strchr(buffer,'\n'); if (p != NULL) *p = 0; else { int c; while ((c = fgetc(fp)) != '\n' && c != EOF); } } int main(int argc, char* argv[]) { char tableau[TAILLE_MAX] = {0}; // voila le tableau initialisé ! char sRemplacement[25] = {0}; int i =0,z =0 ,y = 0; // des variables (je mets souvent des noms de variable completement stupides lors que j'y stock un nombre char nom_fichier_A[255] = {0}; char nom_fichier_B[255] = {0}; FILE* fichier_A = NULL; // On a 2 fichiers a ouvrir / créer FILE* fichier_B = NULL; // il faut mettre un tiret bas et pas un espace (Google est ton ami si tu veut vraiment garder ton espace dans ton nom fichier)... if (argc > 1) { for (i = 1; i < argc; i++) { //le premier argument donne le nom de fichier_A //le second, le nom de fichier_B //a moins qu'on est reçu un argument -h, --help, help, -?, /?, /h, /help if (argv[i][0] == '-' || argv[i][0] == '/' || argv[i][0] == 'h') { if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "help") == 0 || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0 || strcmp(argv[i], "/h") == 0 || strcmp(argv[i], "/help") == 0 ) { printf ("\nUsage: Interface.exe [source [destination]] [help]\n\n source: nom du fichier source\n destination: nom du fichier de destination\n help: affiche ce message d'aide (-h, /h, -?, /?, /help, --help)\n\nExemple: Interface.exe WM408.txt WM508.txt\n Interface.exe WM408.txt\n Interface.exe\n\n"); exit(0); } } if (strcmp(nom_fichier_A, "") == 0) { strcpy(nom_fichier_A, argv[i]); } else if (strcmp(nom_fichier_B, "") == 0) { strcpy(nom_fichier_B, argv[i]); } } } //Ok, on a récupéré nos arguments. //Maintenant, on demande à l'user les infos éventuellement manquantes if (strcmp(nom_fichier_A, "") == 0) { //On a besoin d'un nom_fichier_A printf("Veuillez indiquer le nom du fichier source: "); fgets(nom_fichier_A, sizeof(nom_fichier_A), stdin); clean(nom_fichier_A, stdin); } printf("Nom du fichier source: %s\n", nom_fichier_A); if (strcmp(nom_fichier_B, "") == 0) { //On a besoin d'un nom_fichier_A printf("Veuillez indiquer le nom du fichier de destination: "); fgets(nom_fichier_B, sizeof(nom_fichier_B), stdin); clean(nom_fichier_B, stdin); } printf("Nom du fichier de destination: %s\n", nom_fichier_B); //On ouvre les fichiers printf("\nOuverture des fichiers:\n Fichier source: ........... "); fichier_A = fopen(nom_fichier_A, "r"); if (!fichier_A) { printf("echec\n\nLe fichier '%s' est inexistant ou inaccessible, veuillez verifier le nom du fichier avant de continuer.\n", nom_fichier_A); exit(1); } else { printf("ok\n Fichier de destination: ... "); } fichier_B = fopen(nom_fichier_B, "w"); if (!fichier_B) { printf("echec\n\nImpossible d'ouvrir ou de creer le fichier '%s', veuillez verifier que le disque n'est pas plein ou proteger en ecriture.\n", nom_fichier_B); exit(1); } else { printf("ok\n\n"); } printf("Traitement en cours, veuillez patienter ... "); //Chargement du fichier dans tableau do { tableau[z] = fgetc( fichier_A); // On lit le caractère qu'on stocke dans tableau[z] if (tableau[z] == 24) { printf("Aïe !!! Il va falloir trouver un autre caractère de remplacement !"); exit(2); } z++; // le prochain caractère s'écrira dans la prochaine case du tableau } while ( tableau[z-1] != EOF ); // On aurait pu lire ligne par ligne avec fgets mais on aurait pas pu savoir le nombre de caractère du texte.( il aurait du faire une boucle avec tableau[], alors je préfère remplacer un s par un c :D) z--; for (i = 0 ; i < (z - 2) ; i++) // pour i jusqu'a (z -2) (z=nb de caractère total) Il peut pas y avoir un P21 à l'avant dernier caractère !( et pour pas eviter les depassement de memoires -cf annexes:texte securisé) { if (tableau[i] == 'H' && tableau[i+1] == '5' ) // si le caractère lut est un 'P' , le prochain un '2' et le prochain un '1' c'est qu'on a un P21 { tableau [i+1] = '1' ; // le '2' devient un '1' tableau [i+2] = '1' ; // le '1' devient un '0' } // si t'a compris tu peut faire avec n'importe quel autre truc } //On peut ensuite sauvegarder notre fichier dans fichier_B sRemplacement[0] = ' '; while(y != z) // y est une variable qui définit l'avancement dans le texte et donc dans la chaine donc tans qu'on est pas au bout (z) on continue à lire la chaine { if (sRemplacement[0] == ':' && tableau[y] != ' ') { fputc(' ', fichier_B); } sRemplacement[0] = tableau[y]; fputc(tableau[y], fichier_B) ; // on ecrit le signe de tableau[y] dans le fichier_B y++; //et on lira ensuite le caractère suivant [y+1] } fclose(fichier_A); // et on ferme les fichiers fclose(fichier_B); //et on ferme les fichiers ( moi un adepte du copier coller? Jamais! enfin peut etre..) return 0; // c'est la fin } //c'est la fin ( moi un adepte du copier coller? Jamais! enfin peut etre..) // si tu viens si bas dans les contrées perdu de la programmation c'est peut etre pour savoir le -1: // si on continue c'est seulement si le caractère qu'on viens de lire ne vaut pas EOF. or , on viens de modifier z (z++;) //alors le caractère est stocké dans z-1 et plus dans z c'est donc z-1 qu'on veut tester