A voir également:
- Passage d'un argument en paramètre dans une fonction
- Fonction si et - Guide
- Netflix paramètre compte - Guide
- Remettre parametre usine pc - Guide
- Parametre windows - Guide
- Passage qwerty azerty - Guide
7 réponses
Utilisateur anonyme
20 avril 2013 à 09:05
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 :
Bien sûr, tu dois modifier l' "intérieur" de la fonction en conséquence.
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.
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
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; }
Utilisateur anonyme
22 avril 2013 à 08:18
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.
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.
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 ^^'
Le plus bizarre est que je lis le sleep à la fin mais pas le printf.
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.
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
22 avril 2013 à 12:18
Salut. J'aurai écris
c'est plus logique. Dans un cas simple comme ça, il faut adapter ce que tu lis à l'argument.
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.
J'avais essayer en int sans succès mais le while devant est obligatoire ?
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
23 avril 2013 à 08:33
il est obligatoire si tu veux tout lire.
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
24 avril 2013 à 11:23
as tu vérifié que ton fichier n'était pas vide ?
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:
voici l'erreur lors de la compilation:
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