Passage d'un argument en paramètre dans une fonction

Fermé
Linquisiteur - 20 avril 2013 à 00:48
 Linquisiteur - 25 avril 2013 à 09:22
Bonjour, je suis en train de travailler sur un devoir et dans ce devoir je dois en autre faire passer des paramètre dans des sous fonction. J'ai réussi à crée le programme en utilisant un #define fichier bidule.txt
Mais je voudrais pouvoir entrer le nom du fichier directement en paramètre pour pouvoir choisir le fichier que je veux.
Sur mon code ci dessous on peut voir un de mes essai précédent rater.
Merci d'avance

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

void RandomBin(int nb, char * argv[1]){
	FILE * fichier_dat;
	
	if ((fichier_dat = fopen(argv[1],"wb"))==NULL) {
        perror("Write "); 
        exit(1);
	}
	
    int i = 0;
    int nombre_aleatoire = 0;
    srand(time(NULL)); // initialisation de rand
    for(i=0; i<nb; i++){	
        nombre_aleatoire = rand()%2;
        fprintf(fichier_dat,"%d",nombre_aleatoire);
    }
 fclose(fichier_dat);
}

void DeleteFolder(char * argv[1]){
	FILE * fichier_dat;
	
	if ((fichier_dat = fopen(argv[1],"wb+"))==NULL) {
        perror("Write "); 
        exit(1);
	}
	
    fclose(fichier_dat);
	}

int main (int argc, char * argv[]){
	
  char choix;
  int fin;
  while (fin!=1){
  printf("\033[H\033[2J");
  printf("\nGestion de fichier");
  printf("\n---------------------\n\n");
  printf("\tA Crée un fichier binaire de 100 nombre en int\n");
  printf("\tB Détruire le fichier binaire. \n");
  printf("\tC Afficher le fichier en hexadécimal octet par octet. \n");
  printf("\tD Afficher le fichier en hexadécimal entier par entier. \n"); 
  printf("\tE Afficher le fichier en décimale entier par entier.\n");
  printf("\tQ - Quitter.\n");

  printf("\n\tEntrez votre choix: ");
  scanf("%c", &choix);
  
   if (choix=='A' || choix == 'a') {
        printf ("Remplissage du fichier binaire avec 100 nombres binaire aléatoires \n");		
		int nb_bin=100;
		RandomBin(nb_bin,argv[1]);
		
   }

   if (choix=='B' || choix == 'b') {
		printf("Nettoyage du fichier");
		DeleteFolder(argv[1]);
    }
  
   if (choix=='C' || choix == 'c') {
   
    }
 
   if (choix=='D' || choix == 'd') {
   
   }
   
   if (choix=='E' || choix == 'e') {
   
   }
 

 
   if (choix=='Q' || choix=='q') break;
   }

 return 0;
 }
A voir également:

7 réponses

Utilisateur anonyme
20 avril 2013 à 09:05
Bonjour

L'idée n'est pas mauvaise, mais tu ne dois pas appeler un paramètre argv[1] dans la définition d'une fonction à cause de la présence de l'indice 1. Cela n'a pas de sens car les paramètres formels sont des définitions de variables locales à la fonction, et il est illogique de définir l'élément d'indice 1 d'un tableau : on définit une variable simple ou un tableau, pas un élément d'un tableau.
Attention : dans ce qui précède, je ne parle que de la définition ou déclaration de la fonction, pas de l'endroit où tu l'appelles.
Et justement, tu as fait ça parce que tu savais que tu allais appeler ta fonction avec argv[1] comme paramètre réel. mais il ne faut surtout pas en tenir compte quand tu écris ta fonction. Et comment fais-tu si tu te sers de ta fonction à deux endroits différents avec deux paramètres différents ?
Tu dois seulement te dire que tu as besoin d'un nom de fichier qui est un char*, et donc ne pas écrire :
void RandomBin(int nb, char * argv[1])
mais
void RandomBin(int nb, char * NomFichier)

Bien sûr, tu dois modifier l' "intérieur" de la fonction en conséquence.
1
Merci de l'aide ça marche parfaitement, j'essaie de l'ouvrir et le lire en octet par octect
mais bien que mon programme compile il ne lis rien.
La fonction est dans "ConvHexOctet" mais je ne lis même pas le printf en entrer.
d'ailleurs je ne vois pas la différence entre ces deux affichages:


printf("\tC Afficher le fichier en hexadécimal octet par octet. \n");
printf("\tD Afficher le fichier en hexadécimal entier par entier. \n");

un hexa sur un byte est bien "0001""1111" -> 1F ?
mais sur un entier? "1""1""1""1",etc -> 1111,etc

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

void RandomBin(int nb, char * fichier){   
 FILE * fichier_dat;   
    
 if ((fichier_dat = fopen(fichier,"wb"))==NULL) {   
        perror("Write ");    
        exit(1);   
 }   
    
    int i = 0;   
    int nombre_aleatoire = 0;   
    srand(time(NULL)); // initialisation de rand   
    for(i=0; i<nb; i++){    
        nombre_aleatoire = rand()%2;   
        fprintf(fichier_dat,"%d",nombre_aleatoire);   
    }   
 fclose(fichier_dat);   
}   

void DeleteFolder(char * fichier){   
 FILE * fichier_dat;   
    
 if ((fichier_dat = fopen(fichier,"wb+"))==NULL) {   
        perror("Write ");    
        exit(1);   
 }   
    
    fclose(fichier_dat);   
}   

void ConvHexOctet(char * fichier){   
 FILE * fichier_dat;   
    
    char bits[4];       
 printf("test");   
 if ((fichier_dat = fopen(fichier,"rb"))==NULL) {   
        perror("Read ");    
        exit(1);   
 }   
 unsigned int u;   
  while (fread(&u,sizeof(unsigned int),4,fichier_dat)){   
        printf("%h",u);    
  }   
    fclose(fichier_dat);   
    
 sleep(rand()%5+6);   
}   
int main (int argc, char * argv[]){   
    
  char choix;   
  int fin;   
  while (fin!=1){   
  printf("\033[H\033[2J");   
  printf("\nGestion de fichier");   
  printf("\n---------------------\n\n");   
  printf("\tA Crée un fichier binaire de 100 nombre.\n");   
  printf("\tB Détruire le fichier binaire. \n");   
  printf("\tC Afficher le fichier en hexadécimal octet par octet. \n");   
  printf("\tD Afficher le fichier en hexadécimal entier par entier. \n");    
  printf("\tE Afficher le fichier en décimale entier par entier.\n");   
  printf("\tQ - Quitter.\n");   

  printf("\n\tEntrez votre choix: ");   
  scanf("%c", &choix);   
     
   if (choix=='A' || choix == 'a') {       printf ("Remplissage du fichier binaire avec 100 nombres binaire aléatoires \n");   
  sleep (rand()%2+1);   
  int nb_bin=100;   
  RandomBin(nb_bin,argv[1]);   
     
   }   

   if (choix=='B' || choix == 'b') {   
  printf("Nettoyage du fichier\n");   
  sleep (rand()%2+1);   
  DeleteFolder(argv[1]);   
    }   
     
   if (choix=='C' || choix == 'c') {   
  ConvHexOctet(argv[1]);   
    }   
    
   if (choix=='D' || choix == 'd') {   
      
   }   
      
   if (choix=='E' || choix == 'e') {   
      
   }   
    

    
   if (choix=='Q' || choix=='q') break;   
   }   

 return 0;   
 }   
0
Utilisateur anonyme
22 avril 2013 à 08:18
La différence entre les deux affichages qu'on te demande se situe au niveau de la lecture : soit tu lis octet par octet et tu vas donc afficher des nombres de 00 à FF, sois tu lis entier par entier et le résultat dépend de la taille des entiers sur ton compilateur. Si c'est 4 octets par exemple, tu afficheras des nombres de 00000000 à FFFFFFFF.

il ne lis rien

Je vois deux bonnes raisons : ton fread est incorrect. Regarde bien la définition des paramètres : tel que tu l'as écrit, tu lis 4 unsigned int à chaque fois, alors que la variable n'est qu'un simple unsigned int. C'est même incroyable que ça ne plante pas...
D'autre part, tu formates l'affichage avec %h pour afficher en hexadécimal. Vérifie bien dans le manuel de ton compilateur les formats à utiliser avec printf, car je ne connais pas ce %h, j'ai toujours vu utiliser un autre caractère pour l'hexadécimal.
0
Linquisiteur
22 avril 2013 à 09:36
j'ai modifier mais toujours le même problème.
le fait d'envoyer dans l'adresse de u permet de stocker 4 bits comme un String vrai?

Donc je stock dans ce code 4 char (1 nombre hexa) donc un int (4*1char) puis je le lis en hexa ( %x)

bon je crois que je suis en train de faire entier par entier et non octet par octet mais je verrais sa plus tard ^^'

void ConvHexOctet(char * fichier){
	FILE * fichier_dat;
	
    //char bits[4];    
	
	if ((fichier_dat = fopen(fichier,"rb"))==NULL) {
        perror("Read "); 
        exit(1);
	}
	unsigned int u;
	 while (fread(&u,sizeof(unsigned char),1,fichier_dat)){
        printf("%x",u); 
	 }
    fclose(fichier_dat);
	printf("test");
	sleep(rand()%1+2);


Le plus bizarre est que je lis le sleep à la fin mais pas le printf.
0

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

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
22 avril 2013 à 12:18
Salut. J'aurai écris
fread(&u,sizeof(unsigned int),1,fichier_dat))

c'est plus logique. Dans un cas simple comme ça, il faut adapter ce que tu lis à l'argument.
0
Linquisiteur
22 avril 2013 à 18:41
J'avais essayer en int sans succès mais le while devant est obligatoire ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
23 avril 2013 à 08:33
il est obligatoire si tu veux tout lire.
0
Linquisiteur
23 avril 2013 à 20:55
Dans les 2 cas je ne reçois aucun résultat :(
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
24 avril 2013 à 11:23
as tu vérifié que ton fichier n'était pas vide ?
0
Linquisiteur
24 avril 2013 à 13:43
en fait c'est juste mais je ne vidais pas le buffeur (selon mon prof) j'ai simplement rajouter \n
merci :)
0
Bon j'ai eu un problème et mon fichier récent a été totalement supprimer. bien sur mon ancienne version refuse elle aussi de fonctionner.. elle n'écrit plus dans le fichierbinaire. J'ai aussi comprit que je devais enregistre des int en binaire et non des simples bits aléatoire (et donc le risque d'avoir autre chose que des int)

J'ai refait ma fonction mais j'ai un problème avec car je n'arrive pas à compiler:

void RandomBin(int nb, char * fichier){    
 FILE * fichier_dat;    
     
 if ((fichier_dat = fopen(fichier,"wb"))==NULL) {    
        perror("Write ");     
        exit(1);    
 }    
     
    int i = 0; 
    int nombre_aleatoire = 0; 
    srand(time(NULL)); // initialisation de rand 
    for(i=0; i<nb; i++){ 
   
        nombre_aleatoire = rand()%128; 
       // fprintf("%d ",nombre_aleatoire); 
     fputw(nombre_aleatoire, fichier_dat); 
    }    
 fclose(fichier_dat);    
}


voici l'erreur lors de la compilation:

Undefined                       first referenced
 symbol                             in file
fputw                               /var/tmp//ccYRftn6.o
ld: fatal: Symbol referencing errors. No output written to Labo8
collect2: ld returned 1 exit status
0