Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

langage C

Posté par
smir
29-08-15 à 12:12

Bonjour, je voudrais de l'aide pour cet exercice de langage C
Ecrire un programme en C qui copie un fichier avec ses options (on prendra en compte un fichier source et un fichier destination)

Voici mon code. Mais quand je compile ça ne marche pas.

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

// Affiche l'erreur errStr, puis l'aide du programme
void printError(char * prgName, char * errStr) {
    printf("Error : '%s'\n", errStr);
}

int main(int argc, char *argv[])
{
FILE* fichier_1 = NULL;
FILE* fichier_2 = NULL;
char* option;
char *src, *dest;
char* commande;

if(argc == 3) {
    option="";
    fichier_1 = fopen(argv[1], "r+");
    fichier_2 = fopen(argv[2], "r+");
    src=argv[1];
    dest=argv[2];
}else if(argc == 4) {
    option=argv[1];
    fichier_1 = fopen(argv[2], "r+");
    fichier_2 = fopen(argv[3], "r+");
    src=argv[2];
    dest=argv[3];
}else{
    printError( argv[0], "number d'argument incorrect" );
    return EXIT_FAILURE;
}

if (fichier_1 == NULL )
    {
    printError( argv[1], "Impossible d'acceder a ce fichier" );
    return EXIT_FAILURE;
}

if (fichier_2 == NULL ){
    printError( argv[2], "Impossible d'acceder a ce fichier" );
    return EXIT_FAILURE;
}
commande="cp ";
commande=strcat(commande, option);
commande=strcat(commande, src);
commande=strcat(commande, dest);
if ((strcmp(option, "-f") == 0)|| (strcmp(option, "-i") == 0) || (strcmp(option, "-i")==0) || (strcmp(option, "-R") == 0) || (strcmp(option, "-r") == 0 )|| (strcmp(option, "-s") == 0) || (strcmp(option, "-v") == 0)){
    system(commande);
} else
{
    printError(argv[2], "Option invalide" );    
    return EXIT_FAILURE;    
}

fclose(fichier_1);
fclose(fichier_2);

return EXIT_SUCCESS;
}





langage C

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 13:11

Bonjour,

Chez moi le code compile sans problème.
Tu es sûr que les difficultés n'apparaissent pas à l'exécution ?
Tu le lances le programme avec combien d'arguments sur la ligne de commande ?

Nicolas

Posté par
smir
re : langage C 29-08-15 à 13:25

J'utilise DEV C++
Quand j'ai terminé j'ai fait compiler et exécuter et çà m'affiche le tableau en noir.

Pouvez m'expliquer comment vous l'avez compiler pour que ça marche

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 13:25

Quel tableau ?

Tu lances le programme avec quels arguments sur la ligne de commande ?

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 13:41

Et quand tu fais "Compiler" dans le menu "Exécuter", cela compile ou pas ?

Posté par
smir
re : langage C 29-08-15 à 13:55

Tu lances le programme avec quels arguments sur la ligne de commande ?
Je ne sais pas comment on fait pour lancer le programme avec des arguments sur la ligne de commande.
Quand je clique sur le bouton compiler et exécuter j'ai ce message sur le terminal :

Error 'nombre d'argument incorrect'
......................................................
Process exited after 0.004585 seconds with return value 1
Appuyez sur une touche pour continuer...

Mais quand j'appuie sur une touche pour continuer le terminal se referme

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 14:07

Ce que je comprends...

Ton programme compile.

Quand tu l'exécutes, il renvoie :

Citation :
Error 'nombre d'argument incorrect'
......................................................
Process exited after 0.004585 seconds with return value 1
Appuyez sur une touche pour continuer...


Cela me semble normal.

Dans ton programme, tu demandes d'imprimer "number d'argument incorrect" et de terminer avec une erreur si le nombre d'arguments de la ligne de commande est différent de 3 ou 4. C'est exactement ce qu'il fait.

Ton programme s'exécute donc comme prévu.

Si tu veux l'exécuter avec des arguments en ligne de commande, soit tu le fais depuis une fenêtre MS-DOS, soit tu le fais depuis DEV C++ en précisant ces arguments grâce à Exécuter/Propriétés (je crois).

Nicolas

Posté par
smir
re : langage C 29-08-15 à 14:34

Vous avez compris mon problème

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 14:40

... et je t'ai proposé deux solutions

Posté par
smir
re : langage C 29-08-15 à 15:27

Dans DEV C++ j'ai pas l'option Exécuter/Propriétés , par contre  j'ai l'option Exécuter/Paramètres.
Comme vous le voyez dans l'image ci-jointe

langage C

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 16:51

Parfait. C'est là qu'il faut écrire les arguments de la ligne de commande.

Posté par
smir
re : langage C 29-08-15 à 18:20

Pouvez-vous me donner un exemple des arguments à rentrer.
J'ai essayé avec des chiffres de 0 à 10. Mais ça ne donne pas grand chose

Posté par
Nicolas_75 Correcteur
re : langage C 29-08-15 à 18:25

Je suis surpris par tes questions.
C'est bien toi qui a écrit le programme ? ("mon code")
Qu'attend-il comme argument ?
Comment fonctionne-t-il ?

Posté par
Nicolas_75 Correcteur
re : langage C 30-08-15 à 09:42

Après les "print errors", mets un "getchar();" pour que la fenêtre ne se ferme pas

Remplace les deux "Impossible d'acceder a ce fichier" par "Impossible d'acceder au fichier 1" et "Impossible d'acceder au fichier 2" pour mieux cerner l'erreur.

J'ai compilé le code : cela produit un fichier exe.
J'ai copié une image "Image1.png" dans le répertoire de l'exe.
Depuis une invite MS-DOS de Windows ("cmd"), j'ai exécuté :
Ile644763.exe Image1.png Image2.png
et il renvoie l'erreur "Impossible d'acceder au fichier 2"

Le problème est donc le fopen sur le fichier destination
Es-tu sûr que tu peux faire un fopen sur un fichier qui n'existe pas ?

Nicolas

PS - également posté dans https://openclassrooms.com/forum/sujet/commande-linux-en-c

Posté par
Nicolas_75 Correcteur
re : langage C 30-08-15 à 10:03

En fait, tu n'as aucun besoin de faire des fopen, puisque tu copies ensuite le fichier en faisant en construisant et en lançant une instruction DOS "cp".

Le programme ci-dessous compile et fonctionne.

Pour le faire fonctionner, j'ai copié une image "Image1.png" dans le répertoire de l'exe.
Depuis une invite MS-DOS de Windows ("cmd"), j'ai exécuté :

Ile644763.exe Image1.png Image2.png

où "Ile644763.exe" est le nom du programme exe.
Il a généré Image2.png, copie de Image1.png

Attention, néanmoins, ce programme n'est pas un exemple de bonne programmation en C. Bien au contraire, ce n'est pas ainsi qu'il faut programmer une copie de fichier en C. Cf. les commentaires sur OpenClassRooms.

Nicolas

#include 
#include 
#include 

// Affiche l'erreur errStr, puis l'aide du programme
void printError(char * prgName, char * errStr) {
    printf("Error : '%s'\n", errStr);
} 

int main(int argc, char *argv[]) {
	char *src, *dest, *option;
	char commande[1000];

	if (argc == 3) {
		option = "";
		src = argv[1];
		dest = argv[2];
	} else if (argc == 4) {
		option = argv[1];
		src = argv[2];
		dest = argv[3];
	} else {
		printError(argv[0], "Nombre d'arguments incorrect" );
		getchar();
		return EXIT_FAILURE;
	}

	strcpy(commande, "cp ");
	strcat(commande, option);
	strcat(commande, " ");
	strcat(commande, src);
	strcat(commande, " ");
	strcat(commande, dest);
	printf("Commande : | %s |\n", commande);
	system(commande);

	return EXIT_SUCCESS;
}

Posté par
Nicolas_75 Correcteur
re : langage C 30-08-15 à 10:07

( Les "include" du début sont :
stdio.h
stdlib.h
string.h )

Posté par
smir
re : langage C 30-08-15 à 14:55

D'accord je vais essayé d'améliorer le programme. Mais je ne vois pas dans ton programme les options de cp c'est à dire cp -i; cp -r; cp -f etc...
MERCI

Posté par
Nicolas_75 Correcteur
re : langage C 30-08-15 à 15:17

Citation :
je ne vois pas dans ton programme les options de cp c'est à dire cp -i; cp -r; cp -f etc...


En effet, je me suis attaché à faire un programme simple qui fonctionne.
A toi maintenant de l'enrichir

A nouveau, ce n'est pas la façon naturelle de faire une copie de fichier dans C.

Nicolas

Posté par
smir
re : langage C 30-08-15 à 15:39

Je vous remercie

Posté par
Nicolas_75 Correcteur
re : langage C 30-08-15 à 15:45

Je t'en prie.

Répondre à ce sujet

Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster :

Connexion / Inscription Poster un nouveau sujet
Une question ?
Besoin d'aide ?
(Gratuit)
Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.


Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !