Remplacer chaîne de caractère dans le bloc note

Résolu/Fermé
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 15 juin 2016 à 09:20
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 - 30 juin 2016 à 21:27
Bonjour,

Je suis un grand débutant en programmation...

J'ai actuellement le code suivant qui ouvre mon fichier bloc note :

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE* fichier = NULL;

    fichier = fopen("J:\\TRANSMISSION\\Emis\\freteurope\\Emis\\VIRSEPABNP.XML", "r+");

    if (fichier != NULL)
    {
        // On peut lire et écrire dans le fichier
        
        fclose(fichier);
    }
    else
    {
        // On affiche un message d'erreur si on veut
        printf("Impossible d'ouvrir le fichier test.txt");
    }

    return 0;
}


Je souhaiterais maintenant lire dans le fichier et remplacer la valeur "true" par la valeur "false" qui n’apparaîtra qu'une fois d'ailleurs.

Une idée?

Merci d'avance.
A voir également:

8 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
15 juin 2016 à 11:11
Bonjour,

Le mieux est de créer un fichier temporaire.
Tu parcours ton fichier, et tu recopies dans le fichier temporaire tout le contenu petit à petit en remplaçant la valeur "true" par "false".
Et enfin, tu renommes le fichier temporaire pour qu'il remplace ton fichier.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
16 juin 2016 à 15:11
mon fichier bloc note
Je me permets juste de corriger la confusion: surtout il ne faut pas croire que tu ne peux lire de cette façon que les fichiers créés avec le bloc-note ! Tu peux ouvrir tous les fichiers créés par n'importe quel programme avec fopen, et ils se liront tous avec les mêmes fonctions (quoique sous Windows, je crois qu'il y a une petite différence entre fichiers binaires et fichiers textes, à vérifier ; ce n'est pas le cas sous les systèmes UNIX).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
17 juin 2016 à 02:02
Oui, il y a une différence entre fichier binaire et texte sous Linux. Comme sur Mac.

Et non, tu ne lis pas avec les mêmes fonctions selon que ce soit binaire ou pas (fread() vs fgets()/fprintf() et consort).
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
17 juin 2016 à 07:19
Il y a une difference entre fichier binaire et texte sous GNU/Linux ? Laquelle ?

Sous GNU/Linux, fread() fonctionne sur les fichiers textes même si ce n'est pas fait pour, fgets() et fprintf() fonctionnent sur les fichiers binaires même si ce n'est pas fait pour.
On peut complètement lire tous les octets d'un ficher binaire en faisant une boucle de fgetc(), de la même façon qu'on peut lire toutes les lettres d'un fichier texte avec un fread().

Les modes de fopen() "r" et "rb", "w" et "wb", "rb+" et "r+", etc, sont strictement identiques. C'est écrit dans le man d'ailleurs: The mode string can also include the letter 'b' either as a last character or as a character between the characters in any of the two-character strings described above. This is strictly for compatibility with C89 and has no effect; the 'b' is ignored on all POSIX conforming systems, including Linux. (Other systems may treat text files and binary files differently, and adding the 'b' may be a good idea if you do I/O to a binary file and expect that your program may be ported to non-UNIX environments.)
Par conséquent, il ne doit pas y avoir de différences non plus sous Mac, qui est un système UNIX il me semble.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018
17 juin 2016 à 09:12
Euh, je voulais dire qu'il y avait une différence pour Windows et MAC.
Sur ce point, j'étais d'accord (d'où le "oui") :-).

Sous GNU/Linux, fread() fonctionne sur les fichiers textes même si ce n'est pas fait pour, fgets() et fprintf() fonctionnent sur les fichiers binaires même si ce n'est pas fait pour.
N'oublions pas qu'il faut programmer standard et ne pas se cantonner à un système d'exploitation. Donc fread() c'est pour les fichiers binaires, peu importe l'OS.
Je ne vois pas l'intérêt de lire avec fread() un fichier texte, même si ça marche oO. fread() -> binaire, fgets() -> texte.
Dans la même veine : même sous GNU/Linux, il vaut mieux utiliser le mode "b". Il sera certes ignoré, mais cela permettra le fonctionnement sur les autres OS.

Par conséquent, il ne doit pas y avoir de différences non plus sous Mac, qui est un système UNIX il me semble.
Sauf que sous MAC (tout du moins jusqu'à MAC OS X), l'opérateur de fin de ligne est '\r' et non '\n'. Donc ça marche pas, il y a une différence entre binaire et texte...
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
28 juin 2016 à 03:16
Heu, en vrai y'a aucune différence, c'est pas un attribut du fichier, juste un mode de lecture qui va traduire les retours à la ligne pour match le standard.

Mais on s'en fout en fait. C'est une discussion sensée, ok, mais elle a pas sa place ici. C'est pas cool pour le ptit gars qui veut juste savoir comment faire sa fonction !

Sous GNU/Linux, fread() fonctionne sur les fichiers textes même si ce n'est pas fait pour, fgets() et fprintf() fonctionnent sur les fichiers binaires même si ce n'est pas fait pour.
Ouais, ou alors tu te rends compte que tous les fichiers sont binaires, et que tu peux utiliser le mode texte pour te macher le travail avec la portabilité des retours à la ligne, et c'est tout.
En plus fopen et fread c'est juste des layers de compat avec open et read sous linux.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
17 juin 2016 à 12:09
Bonjour,

Je ne sais pas si j'ai bien fait de poser cette question, je ne comprend strictement rien aux réponses :)

Je ne pense pas arriver à coder seul ce dont j'ai besoin malheureusement.

Je vous remercie quand-même pour votre aide.

Cordialement.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 17/06/2016 à 13:10
fiddy t'a bien expliqué pourtant:

1. Ouvre en mode lecture (fonction fopen()) le fichier dans lequel tu veux remplacer les "false" en "true".
2. Ouvre en mode écriture (fonction fopen() toujours) un autre fichier avec un nom que tu obtiens avec la fonction tmpnam() (afin d'être sûr que le fichier n'existe pas déjà).
3. Lis le fichier en lecture caractère par caractère (boucle de fgetc()).
a) Si le caractère que tu obtiens est un t, tu lis 3 caractères de plus pour vérifier si ces 4 caractères forment "true". Si oui, tu écris "false" (fonction fputs()) dans le fichier en écriture, sinon, tu réécris tels quels ces 4 caractères (fonction fprintf() par exemple).
b) Si le caractère que tu obtiens n'est pas un t, tu l'écris tel quel dans le fichier en écriture (fonction fputc()).
4. Tu fermes les deux fichiers (fonction fclose()).
5. Tu renommes le fichier écrit vers le nom du fichier lu (fonction rename()) afin de l'écraser (note: peut-être que rename() refusera de renommer le fichier tant que le fichier en lecture existe. Tu peux le supprimer au moyen de la fonction remove().)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842 > paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018
17 juin 2016 à 13:51
Tempnam () plutôt non ?
Cette fonction n'est pas standard.

Tu peux simplement utiliser le mode "r+" de fopen () et contrôler sa valeur de retour.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 17/06/2016 à 15:27
Si si, tmpnam() est une fonction standard (et depuis le début), déclarée dans <stdio.h> :) tempnam(), en revanche, n'est qu'un standard POSIX.

Protoype:
char *tmpnam(char *s);
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
17 juin 2016 à 19:55
Wouah, je ne connaissais pas du tout ! Merci paly2 :-).
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
18 juin 2016 à 17:16
de rien :)
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
27 juin 2016 à 16:25
Bonjour,

Je n'arrive pas à adapter. J'ai compris le fonctionnement de la procédure paly2, elle est très claire. Simplement avec mes quelques heures de langage en C, je ne suis actuellement pas capable de l'écrire :(

De plus, l'idée est de check si le dossier "J:\\TRANSMISSION\\Emis\\freteurope\\Emis\\" est vide ou non, si il contient un fichier texte nommé "VIRSEPABNP.XML", alors on lance la procédure.

Pardon pour ma demande très floue et sans expérience....

Cordialement.
0
Sugel Messages postés 4076 Date d'inscription jeudi 18 août 2011 Statut Membre Dernière intervention 19 juin 2017 725
28 juin 2016 à 03:22
Divise ton travail en sous-tâches: première étape, remplacer un mot dans du texte.
Essaie de faire une fonction qui recherche un mot dans du texte. Tu peux utiliser strcmp ou strncmp pour ça. Ensuite, fais une fonction qui réécris le texte avec le mot remplacé.

Il te suffit ensuite de l'appliquer à chacune des lignes de ton fichier, que tu écris une par une dans un nouveau fichier.
La procédure est la suivante: si la ligne ne contiens pas ton mot, tu l'écris telle quelle.
Sinon, tu écris la ligne avec le mot remplacé.

Une fois l'opération terminée, tu replace l'ancien fichier par le nouveau.

Pardon pour ma demande très floue et sans expérience....
Pas la peine de t'excuser :)

Essaie de mettre en œuvre ce que j'ai tenté d'expliquer plus haut, et si tu n'y arrive pas, on devrait pouvoir t'aider facilement.

Bonne nuit !
0

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

Posez votre question
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
28 juin 2016 à 17:03
Voilà, ce code fonctionne:
#include <stdio.h>

int main(void) {
	const char nom_lecture[] = "fichier.txt";
	FILE* lecture = fopen(nom_lecture, "r");
	if (lecture == NULL)
		return 1;
	
	char* nom_ecriture = tmpnam(NULL);
	FILE* ecriture = fopen(tmpnam(NULL), "w");
	if (ecriture == NULL)
		return 1;
	
	int c;
	while ((c = fgetc(lecture)) != EOF) {
		if (c == 't') {
			char suite[4] = "";
			fgets(suite, 4, lecture);
			if (suite[0] == 'r' &&
			    suite[1] == 'u' &&
			    suite[2] == 'e')
				fputs("false", ecriture);
			else {
				fseek(lecture, -3, SEEK_CUR);
				fputc(c, ecriture);
			}
		} else
			fputc(c, ecriture);
	}
	
	fclose(lecture);
	fclose(ecriture);
	
	remove(nom_lecture);
	rename(nom_ecriture, nom_lecture);
	
	return 0;
}


Il remplace tous les "true" par des "false" dans le fichier fichier.txt.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
28 juin 2016 à 17:56
Bonjour,

C'est absolument parfaitement ce que je voulais. Après l'avoir testé dans CodeBlocks, ce code marche parfaitement.

Si je peux me permettre, je vais commenter ce code pour que vous me disiez si j'ai bien compris tout ce qu'il fait (seulement si vous avez un peu de temps à me consacrer, j'ai soif d'apprendre).

Je mettrai ce code commenté demain mais je vous remercie du fond du coeur pour ce travail en tout cas.

Cordialement.
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
28 juin 2016 à 18:44
@paly2 : en caractère par caractère, comme tu le proposes, je pense qu'on pourrait aussi dans le else écrire un 't' avec fputc et écrire les 3 caractères lus avec fputs si finalement ils ne contiennent pas "rue", cela évite un fseek en arrière et une nouvelle lecture de choses ayant déjà été lues.


Dal
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
28 juin 2016 à 18:52
Oui, mais en réalisant le code je me suis aperçu que ça ne fonctionnait pas sur la suite de caractères suivante par exemple :
t true

Parce que le programme lit le t, puis l'espace, l'autre t, le r, s'aperçoit que ça ne forme pas "true" (mais "t tr"), et le réécrit tel quel dans le fichier en écriture, si bien que le "true" ici n'est jamais remplacé.

Je l'ai donc remplacé par un fseek(), qui permet au programme de bien fonctionner dans toutes les situations.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 28/06/2016 à 19:05
Euh Kuartz corrige aussi mon erreur (dont je viens de m'apercevoir), j'utilise
tmpnam(NULL)
pour ouvrir le fichier à la place de
nom_ecriture
. En pratique la fonction va retourner deux fois la même chose (parce que le fichier n'existera encore dans aucun des deux cas), c'est pour cela que ça marche, mais en théorie rien ne force tmpnam() à le faire.
La ligne 10 doit donc être:
FILE* ecriture = fopen(nom_ecriture, "w");



De plus, je mets
nom_lecture
en
const
, mais pas
nom_ecriture
, ce qui n'est pas cohérent.
La ligne 9 devrait donc être, pour une question de propreté:
const char* const nom_ecriture = tmpnam(NULL);
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
28 juin 2016 à 19:01
@paly2, oui, bien vu :-)
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
29 juin 2016 à 09:53
Bonjour bonjour,

J'ai modifié les éléments comme vous me l'avez dit. Merci encore une fois pour votre incroyable implication et vos connaissances.

Voici le code avec mes commentaires. Je vous prie d'avance de m'excuser pour toutes les aberrations que vous pourrez voir. Je ne suis qu'un petit novice qui veut apprendre. J'ai déjà appris quelques heures sur OpenClassroom, mais je suis de ceux qui croient que la pratique est la meilleure manière d'apprendre.

#include <stdio.h>

int main(void) {
	const char nom_lecture[] = "fichier.txt"; //Déclaration d'une constante de type char appelée nom_lecture (pourquoi [], c'est un tableau?) qui est mon fichier texte à modifier
	FILE* lecture = fopen(nom_lecture, "r"); // Déclaration d'une variable de type FILE appelée lecture qui ouvre et lit le fichier nom_lecture (pourquoi un pointeur sur FILE?, Que veux dire le "r"?)
	if (lecture == NULL) // Si lecture = rien, donc si le fichier texte n'existe pas
		return 1; // Fin du code

	const char* nom_ecriture = tmpnam(NULL); //Création d'une constante de type char appelée nom_ecriture qui est en fait un fichier temporaire (Pourquoi (NULL)?)
	FILE* ecriture = fopen(nom_ecriture, "w"); //Déclaration d'une variabe de type FILE appelée ecriture qui ouvre et lit le fichier temporaire (que veut dire le "w"? Pourquoi (NULL)?)
	if (ecriture == NULL) //Si le fichier temporaire n'existe pas
		return 1; //Fin du code (pourquoi return 1 et non 0? Parce qu'il s'agit d'une coupure anticipée?

	int c; //Déclaration d'une variable de type int appelée "c" (Pourquoi ne pas l'avoir déclaré en char??)
	while ((c = fgetc(lecture)) != EOF) { //Tant que c qui est la lecture caractère par caractère du fichier texte est différent de la fin du fichier texte
		if (c == 't') { //Si c est égal à la lettre t alors
			char suite[4] = ""; //Déclaration d'une variable de type char qui est un tableau de 4 entrées initialisé à ""
			fgets(suite, 4, lecture); //Lecture de 4 caractères mais je ne comprend pas ce qui l'oblige à prendre les 4 caractères suivants?
			if (suite[0] == 'r' && //Si la première lettre après 't' est r
			    suite[1] == 'u' && //La 2ème lettre après 't' est u
			    suite[2] == 'e') // La 3ème lettre après 't' est e
				fputs("false", ecriture); //Ecrire "false" dans le fichier temporaire
			else { //Sinon
				fseek(lecture, -3, SEEK_CUR); //Je ne comprend pas :(
				fputc(c, ecriture); // Ecrire le contenu de c dans le fichier temportaire
			}
		} else //Sinon
			fputc(c, ecriture); // Ecrire le contenu de c dans le fichier temporaire
	}

	fclose(lecture); //Ferme le fichier texte
	fclose(ecriture); //Ferme le fichier temporaire

	remove(nom_lecture); //Supprime le fichier texte
	rename(nom_ecriture, nom_lecture); //Renomme le fichier temporaire avec le nom du fichier texte désormais supprimé.

	return 0; //Fin du code
}
 


Merci 1000 fois pour vos réponses. J'espère que vous aurez le temps de me répondre. Sinon ne perdez pas votre temps, j'ai déjà bien assez abusé.

Cordialement.
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 29/06/2016 à 10:49
Salut Kuartz,

Une chaîne de caractères en C est un tableau de char terminé par un caractère NULL '\0'.

La plupart des autres questions sont relatives à la syntaxe, aux paramètres et au comportement des fonctions standard du C. Apprends à chercher par toi même, en consultant ton ouvrage de référence (ton cours, ton manuel), dans le standard du C, et dans de multiples sources en ligne explicatives.

par exemple :

http://www.cplusplus.com/reference/cstdio/fopen/
http://www.cplusplus.com/reference/cstdio/tmpnam/
http://www.cplusplus.com/reference/cstdio/fgets/
http://www.cplusplus.com/reference/cstdio/fseek/

un autre site de référence est cppreference.com

en dépit de leur nom, ces sites contiennent des informations à jour sur les fonctions standard du C (outre des informations sur le C++), avec des exemples de code fort utiles.

Sous Linux ou systèmes de type Unix, tu as aussi les pages de manuel accessibles en ligne de commande. Par exemple
man 3 fopen


S'il y a vraiment quelque chose que tu ne comprends pas après avoir lu la documentation de ces fonctions, pose ta question ici en précisant ce que tu n'as pas compris.


Dal
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
29 juin 2016 à 11:50
Ca marche, merci beaucoup pour les infos.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
Modifié par Kuartz le 29/06/2016 à 11:56
Petite question supplémentaire, sachant que je dois rééxécuter ce code plusieurs fois pour plusieurs fichiers texte à plusieurs endroits, comment dois-je faire pour répéter l'opération?

J'ai essayé comme ceci :

#include <stdio.h>

int main(void) {

    //Code pour XXX

 const char nom_lecture[] = "J://TRANSMISSION//Emis//xxx//VIRSEPABNP.XML";
 FILE* lecture = fopen(nom_lecture, "r");
 if (lecture == NULL)
  goto test;

 const char* nom_ecriture = tmpnam(NULL);
 FILE* ecriture = fopen(nom_ecriture, "w");
 if (ecriture == NULL)
        goto test;

 int c;
 while ((c = fgetc(lecture)) != EOF) {
  if (c == 't') {
   char suite[4] = "";
   fgets(suite, 4, lecture);
   if (suite[0] == 'r' &&
       suite[1] == 'u' &&
       suite[2] == 'e')
    fputs("false", ecriture);
   else {
    fseek(lecture, -3, SEEK_CUR);
    fputc(c, ecriture);
   }
  } else
   fputc(c, ecriture);
 }

 fclose(lecture);
 fclose(ecriture);

 remove(nom_lecture);
 rename(nom_ecriture, nom_lecture);

 //Code pour XXX

 test:

 const char nom_lecture2[] = "J://TRANSMISSION//Emis//xxx//VIRSEPABNP.XML";
 FILE* lecture2 = fopen(nom_lecture2, "r");
 if (lecture2 == NULL)
  goto test2;

 const char* nom_ecriture2 = tmpnam(NULL);
 FILE* ecriture2 = fopen(nom_ecriture2, "w");
 if (ecriture2 == NULL)
  goto test2;

 int g;
 while ((g = fgetc(lecture2)) != EOF) {
  if (g == 't') {
   char suite[4] = "";
   fgets(suite, 4, lecture2);
   if (suite[0] == 'r' &&
       suite[1] == 'u' &&
       suite[2] == 'e')
    fputs("false", ecriture2);
   else {
    fseek(lecture2, -3, SEEK_CUR);
    fputc(g, ecriture2);
   }
  } else
   fputc(g, ecriture2);
 }

 fclose(lecture2);
 fclose(ecriture2);

 remove(nom_lecture2);
 rename(nom_ecriture2, nom_lecture2);

  //Code pour XXX

    test2:

 const char nom_lecture3[] = "J://TRANSMISSION//Emis//xxx//VIRSEPABNP.XML";
 FILE* lecture3 = fopen(nom_lecture3, "r");
 if (lecture3 == NULL)
  return 1;

 const char* nom_ecriture3 = tmpnam(NULL);
 FILE* ecriture3 = fopen(nom_ecriture3, "w");
 if (ecriture3 == NULL)
  return 1;

 int i;
 while ((i = fgetc(lecture3)) != EOF) {
  if (i == 't') {
   char suite[4] = "";
   fgets(suite, 4, lecture3);
   if (suite[0] == 'r' &&
       suite[1] == 'u' &&
       suite[2] == 'e')
    fputs("false", ecriture3);
   else {
    fseek(lecture3, -3, SEEK_CUR);
    fputc(i, ecriture3);
   }
  } else
   fputc(i, ecriture3);
 }

 fclose(lecture3);
 fclose(ecriture3);

 remove(nom_lecture3);
 rename(nom_ecriture3, nom_lecture3);

 return 0;
}


Seulement voilà, mes goto ne marchent pas (je sais c'est pas bien de toute façon). Disons que les return 1 arrêtaient le code si le fichier n'existait pas alors que si le premier fichier n'existe pas, alors on arrête le premier code mais le code pour le second fichier doit s'éxecuter lui et pareil du 2ème fichier au 3ème fichier.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 29/06/2016 à 12:47
Pour répéter l'opération, il suffit de faire une fonction que tu appelles plusieurs fois.
Un petit tuto sur les fonctions: https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/14997-les-fonctions

#include <stdio.h>

int remplacer_true_par_false(char* nom_lecture) {
    FILE* lecture = fopen(nom_lecture, "r");
    if (lecture == NULL)
        return 1;
    /* Etc, comme dans la fonction main dans le code que je t'ai donné */
}

int main(void) {
    if (remplacer_true_par_false("J://TRANSMISSION//Emis//xxx//VIRSEPABNP.XML")) // Cette ligne est très dense: elle appelle la fonction remplacer_true_par_false, et en même temps vérifie son retour.
        fprintf(stderr, "Erreur premier fichier\n"); // N'hésite pas à mettre des messages d'erreur plus parlants. Tu peux aussi les mettre directement dans la fonction remplacer_true_par_false.

    if (remplacer_true_par_false("J://TRANSMISSION//Emis//xxx//VIRSEPABNP.XML"))
        fprintf(stderr, "Erreur deuxième fichier\n");

    // Et tu peux ainsi appeler la fonction autant de fois que tu veux.
    return 0;
}


Je pense qu'il s'agit du moyen le plus propre de procéder.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61 > paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018
Modifié par Kuartz le 29/06/2016 à 13:51
Re,

Merci beaucoup pour les conseils. Sachant par contre qu'en réalité, je ne souhaite pas de message d'erreur. Si il ne trouve pas le fichier en question et bien il laisse tomber et puis il passe au suivant etc.

En fait, je vais automatiser l'exe afin qu'il s'exécute toutes les minutes sur le serveur. Autant dire que le message d'erreur n'est pas le bienvenue.

Cordialement.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61
29 juin 2016 à 14:43
Du coup tout marche très bien, je n'utilise juste pas les "if" j'appelle la fonction 3 fois.

Merci beaucoup pour votre aide, mon problème est résolu :)

Cordialement.
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
Modifié par paly2 le 29/06/2016 à 17:31
Si tu appelles la fonction sans vérifier son retour, ça ne sert à rien de la faire retourner quelque chose alors :-)

Les fonctions qui ne retournent rien sont les fonctions de type
void
:
void remplacer_true_par_false(const char* const nom_lecture)
/* Oui, j'avais encore oublié les const. Note qu'on peut en mettre deux: le premier signifie qu'on ne peut pas modifier la valeur à l'adresse vers laquelle pointe le pointeur (c'est-à-dire la chaîne de caractères), et le second signfie qu'on ne peut pas modifier l'adresse vers laquelle pointe le pointeur (donc qu'on ne peut pas le faire pointer vers une autre chaîne). */


En cas d'erreur, pour arrêter la fonction, il suffit de faire
return;
, sans aucune valeur.
0
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 61 > paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018
30 juin 2016 à 17:08
Merci pour tout ce que vous m'avez appris :)
0
paly2 Messages postés 254 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 15 février 2018 25
30 juin 2016 à 21:27
De rien, c'est pour ça que je suis là :)
0