[C] Une basique suppression

Résolu/Fermé
Utilisateur anonyme - Modifié par Saachaa le 15/06/2012 à 18:39
 Utilisateur anonyme - 18 juin 2012 à 20:29
Bonjour les CCMistes !

Je galère avec ce simple bout de morceau de code... mais comme ça fait longtemps et que je débute...

Tout simplement, je veux pouvoir supprimer un fichier avec une syntaxe comme :

C:\Users\Sacha\mon_code.exe "chemin\fichier_à_supprimer"


Et que celui-c, me retourne s'il est supprimé le chemin de l'exécutable dans un fichier texte en l'occurrence :

C:\force_delete.txt


Je suppose qu'il doit y avoir des erreurs grossières, mais je ne m'en sors pas...

#include <StdAfx.h> 
#include <stdio.h> 

int main (int argc, char * argv[]) { 
 int _remove; 
 FILE * rapport; 

 _remove=remove(const char * pathname); 
  
  if _remove = 0  
  { 
   rapport = fopen("C:\\force_delete.txt", "w"); 
   if (rapport == NULL)  
   { 
    fprintf("C:\\force_delete.txt", "erreur"); 
    exit(0); 
   } 
   else 
   { 
   fprintf("C:\\force_delete.txt", _remove); 
   } 
  } 
 fclose(rapport); 
 return(0); 
} 
} 


Erreur code :

1>------ Début de la génération : Projet : Test, Configuration : Debug Win32 ------
1>  Test.cpp
1>Test.cpp(10): error C2143: erreur de syntaxe : absence de ')' avant 'const'
1>Test.cpp(10): error C2660: 'remove' : la fonction ne prend pas 0 arguments
1>Test.cpp(10): error C2059: erreur de syntaxe : ')'
1>Test.cpp(12): error C2061: erreur de syntaxe : identificateur '_remove'
1>Test.cpp(13): error C2143: erreur de syntaxe : absence de ';' avant '{'
1>Test.cpp(18): error C3861: 'exit' : identificateur introuvable
1>Test.cpp(22): error C2664: 'fprintf' : impossible de convertir le paramètre 1 de 'const char [22]' en 'FILE *'
1>          Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
1>Test.cpp(28): error C2059: erreur de syntaxe : '}'
1>Test.cpp(28): error C2143: erreur de syntaxe : absence de ';' avant '}'
1>Test.cpp(28): error C2059: erreur de syntaxe : '}'


Thanks !



?? Saachaa ?
Contributeur CCM
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 835
16 juin 2012 à 01:01
Bonjour,

Outch, plein d'erreurs.

Pourquoi : #include <StdAfx.h> ? C'est plutôt <stdafx.h>. Mais t'en as pas besoin ici. Autant alléger le code.

int _remove;
Un conseil, ne commence pas tes noms de variable par un _. C'est autorisé dans certains cas (ici ça l'est), mais cela t'évitera bien des problèmes parfois.

_remove=remove(const char * pathname);
Attention à ne pas confondre prototype de fonction et appel de fonction.
Le prototype de remove() est : int remove(const char* pathname);
Pour l'appeler : remove(nomDuFichierASupprimer).
Donc dans ton cas ça sera : _remove=remove(argv[1]);
Pour info argv[1] vaudra "chemin\fichier_à_supprimer" si tu lances ton programme : C:\Users\Sacha\mon_code.exe "chemin\fichier_à_supprimer"

if _remove = 0
Pour comparer une valeur avec une autre, on utilise l'opérateur double égal. Et il ne faut pas oublier les parenthèses.
Soit : if (_remove == 0)

fprintf("C:\\force_delete.txt", "erreur");
Ce n'est pas le nom du fichier qu'il faut mettre mais le stream.
Ce qui donne : fprintf(rapport, "erreur");. Mais attention, tu ne peux pas le faire dans la boucle if(rapport==NULL). Si l'ouverture a échoué, tu ne peux pas écrire dedans.
Pareil pour l'autre fprintf.

exit(0);
Dans le main, pas de exit(0) sinon ton programme ne renverra pas de valeur.

fclose(rapport);
Si l'ouverture du fichier a échoué, autant ne pas le fermer. Donc plutôt dans la boucle.

return(0);
return n'est pas une fonction. Donc on met plutôt : return 0;

Et enfin, tu n'as pas mis de return 0; lorsque _remove était différent de 0.

Je t'invite à revoir les bases.

Bon courage,
Cdlt,
1
canarder Messages postés 1706 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
15 juin 2012 à 18:33
Bonjour,

citer ce qu'il ne fonctionne pas dans ton code aiderait à t'aider.
0
Utilisateur anonyme
15 juin 2012 à 18:38
Hey,

Pleins d'erreurs que je ne comprends pas, je les rajoute dans le post.
0
canarder Messages postés 1706 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
15 juin 2012 à 18:44
c'est if(condition)
et non pas if condition
0
canarder Messages postés 1706 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
Modifié par canarder le 15/06/2012 à 18:45
et pour terminer le programme tu dois mettre ça :
return(0);
au lieu de :
exit(0);
0
canarder Messages postés 1706 Date d'inscription jeudi 28 août 2008 Statut Membre Dernière intervention 13 mai 2018 354
15 juin 2012 à 18:47
je ne peux pas trop t'aider je fais du c++ et pas du c.
les erreurs sont en anglais, mais si tu utilises un bon ide, il doit te trouver les erreurs en français.
0

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

Posez votre question
Utilisateur anonyme
15 juin 2012 à 18:52
L'anglais ne me gène pas, mais je ne comprends pas mes erreurs...

Ok pour IF, exit(0) fonctionne aussi il me semble.

Dans le pire des cas je peux regarder pour le faire en C++...
0
Utilisateur anonyme
16 juin 2012 à 12:33
Salut Fiddy, ;-)

Les bases oui... mais je ne mets pas assez souvent le nez dedans et reste dans un autre langage... sûrement la cause de ces erreurs.

Si je ne mets pas le header de départ, j'obtiens ça :

1>------ Début de la génération : Projet : Test, Configuration : Debug Win32 ------
1>  Test.cpp
1>Test.cpp(1): warning C4627: '#include <stdio.h>' : ignoré lors de la recherche d'une utilisation d'un en-tête précompilé
1>          Ajoutez la directive à 'StdAfx.h' ou régénérez l'en-tête précompilé
1>Test.cpp(27): fatal error C1010: fin de fichier inattendue lors de la recherche d'un en-tête précompilé. N'auriez-vous pas oublié d'ajouter '#include "StdAfx.h"' à votre source ?
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


#include <stdafx.h> -> pourquoi en fait ?

Et enfin, tu n'as pas mis de return 0; lorsque _remove était différent de 0. 


Je dois faire un ? :

if (_remove != 0)
     Return 0;


Merci pour tes instructions, voici ce que ça me donne :

#include <stdafx.h>
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 

int main (int argc, char * argv[]) {
	int _remove;
	FILE * rapport;

	_remove=remove(argv[1]);
	
		if (_remove == 0)
		{
			rapport = fopen("C:\\force_delete.txt", "w");
			if (rapport == NULL) 
			{
				return(1);
			}
			if (rapport != NULL) // ici je ne devrais pas plutôt trouver la valeur que revoi fopen pour savoir s'il est bien ouvert ?
			{
				fprintf(rapport, _remove);
				fclose(rapport);
                                return(0);
			}
		}
		if (_remove != 0)
		{
			return(0);
		}
}


En revanche, j'obtiens ce message d'erreur :

1>------ Début de la génération : Projet : Test, Configuration : Debug Win32 ------
1>  Test.cpp
1>Test.cpp(13): warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1>          C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\stdio.h(234) : voir la déclaration de 'fopen'
1>Test.cpp(20): error C2664: 'fprintf' : impossible de convertir le paramètre 2 de 'int' en 'const char *'
1>          La conversion d'un type intégral en type pointeur nécessite reinterpret_cast, un cast de style C ou un cast de style fonction
========== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========


Quel est la différence entre return 0;, et return (0); ?

Merci :-)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 juin 2012 à 12:54
#include <stdafx.h> -> pourquoi en fait ?
C'est un entête obscure. Lol. Tu en as besoin ici que parce que tu es sous Visual Studio (ou du genre). Sur un compilateur standard comme gcc, tu n'en aurais pas besoin. Bon ici, s'il faut mettre, beh mets-le ^^.
Je remarque par ailleurs que tu utilises un fichier .cpp (extension C++). Utilise plutôt un fichier en .c. Le C et le C++ sont deux langages différents.

if (_remove != 0)
Return 0;

Pas nécessairement. Tu as fait un : if (_remove == 0). Tu peux donc utiliser un else tout bêtement. Ce qu'il faut retenir ici est qu'il faut que dans tous les cas, ton programme rencontre un return x;. Ce qui n'était pas le cas ici.
Si tu préfères, tu peux mettre tout simplement un return 0; tout à la fin de ton programme.

_remove=remove(argv[1]);
Je te l'ai pas dit, mais il faut utiliser argv[1] que si argc > 1. Sinon, cela voudra dire que tu as lancé le programme sans paramètre.

fopen("C:\\force_delete.txt", "w");
Pareil, tu peux mettre argv[1]. Ou encore mieux. Tu te crées une variable genre : const char *nomFichier=argv[1]; Comme ça tu pourras utiliser nomFichier directement. N'oublie pas non plus de tester si argc > 1.

if (rapport != NULL) // ici je ne devrais pas plutôt trouver la valeur que revoi fopen pour savoir s'il est bien ouvert ?
Pas besoin. Tu fais un else à la place.
if (rapport == NULL) {
  ...
}
else {
   ...
}

Et non pas besoin de tester la valeur que te renvoie fopen. Tu ne pourras pas en faire grand chose de toute manière. Soit ça vaut NULL et le fichier n'a pas pu être créé pour diverses raisons soit cela a bien marché.

fprintf(rapport, _remove);
J'ai dit des bêtises. Il était tard hier ^^.
fprintf(rapport, "%d", _remove);

if (_remove != 0)
Un else est suffisant.

Quel est la différence entre return 0;, et return (0); ?
Aucune. C'est jusque que les parenthèses sont inutiles. C'est exactement comme si tu faisais : (5) + (5) au lieu de 5+5. C'est moche hein ? ^^. Beh là c'est pareil : return 0; suffit et c'est plus joli (amha).
0
Oui pour le .cpp, mais c'est visual basic qui a fait ça... ça change qlqc à la compilation ?
Ok pour l'entête, sous Linux on n'en avait pas besoin donc bon...

Je galère que le C n'a rien à voir avec le langage que j'utilise tous les jours... deux méthodes différentes et c'est dur d'assimiler celles-ci...

Pourquoi on déclare un array dans le main ?

argc c'est un arguments qui contient le nombre de paramètres que tu veux passer.   
argv est un tableau qui contient les paramètres. 


C'"est bien cela ?

Ah aussi, pourquoi pas de _ devant mes variables ?

Apparemment ça marche nickel, le programme vient de se lancer sans... soucis. :)

Je teste ! Au final, j'ai ça :

#include <stdafx.h>   
#include <stdio.h>   
#define _CRT_SECURE_NO_WARNINGS    

int main (int argc, char * argv[]) {   
 int _remove;   
 const char *nom=argv[1];    
 FILE * rapport;   

 if (argc > 1) {   
  _remove=remove(nom);   
 }   
 else {   
  return(1);   
 }   
    
  if (_remove == 0)   
  {   
   rapport = fopen("C:\\force_delete.txt", "w");   
   if (rapport == NULL)    
   {   
    return(1);   
   }   
   else   
   {   
    fprintf(rapport, "%d", _remove);   
    fclose(rapport);   
    return(0);   
   }    
  }   
  else    
  {   
   return(1);   
  }   
}


Merci ;-)

Edit: Dans le fichier texte je me retrouve avec 0 si je le lance ainsi (le programme supprime bien en passant), et une suite de nombre si je mets :

fprintf(rapport, "%d", nom);

Edit 2 : Rempalcé par "%s" ça passe crème. :)

?? Saachaa ?
Contributeur CCM
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 juin 2012 à 14:26
Pourquoi on déclare un array dans le main ?
Ce n'est pas obligatoire. Cela dépend si tu as besoin de récupérer les paramètres placés au moment de l'exécution. Si tu n'as pas besoin tu peux mettre simplement : int main (void).
argc c'est un arguments qui contient le nombre de paramètres que tu veux passer.
argv est un tableau qui contient les paramètres.

Oui pour argc à 1 près. argc contient le nombre de paramètres + 1.
Oui pour argv.

Ah aussi, pourquoi pas de _ devant mes variables ?
Car comme je t'ai dit au début, dans certains cas ce sera des noms de variables interdits. Par exemple, un nom de variable commençant par _ ne peut pas être suivi d'une majuscule. Ce n'est pas le seul exemple. Pour simplifier, il est d'usage de ne pas commencer par un _ en C.

C'est à ce moment là qu'il faut tester argc.
const char *nom=argv[1];

if (argc > 1) {
_remove=remove(nom);
}


fprintf(rapport, "%d", nom);
nom est un pointeur sur argv[1] qui est donc une chaîne de caractères. Il faut donc mettre %s. Pour _remove (qui est un int) il faut mettre %d. Cela dépend du type de la variable.
0
Utilisateur anonyme
16 juin 2012 à 14:54
Hum d'accord parfait merci :-)

En passant, tu as des outils à ton actif ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 juin 2012 à 15:45
Outils que j'ai réalisés ou outils que j'utilise pour la programmation ?
0
Utilisateur anonyme
16 juin 2012 à 18:37
Que tu as créé :)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 juin 2012 à 20:57
En C, rien de bien intéressant (gestion de répertoire téléphonique, et d'autres conneries du genre).
Je préfère le Python (même si je connais moins) qui permet de faire des programmes plus rapidement. Dans ce langage, j'ai notamment créé detectpromisc
0
Utilisateur anonyme
18 juin 2012 à 20:29
J'ai vu cela, SF en plus :)
0