Ouvrir un fichier en lecture avec argv ?
linquisiteur
-
linquisiteur -
linquisiteur -
Bonjour, je "m'amuse" à utiliser le paramètre argv dans divers situation et j'ai récemment tenter d'ouvrir un fichier avec mais j'ai toujours une erreur..
j'aimerai que si je tape pierre.txt le compte pierre.txt soit afficher (d'autre option à venir)
même si possible (aucune idée comment faire) que si je tape "pierre" le compte pierre.txt soit débiter
Voici le code en question:
l'erreur:
Merci d'avance !
j'aimerai que si je tape pierre.txt le compte pierre.txt soit afficher (d'autre option à venir)
même si possible (aucune idée comment faire) que si je tape "pierre" le compte pierre.txt soit débiter
Voici le code en question:
#include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <unistd.h> #include <sys/types.h> #include <string.h> #include <fcntl.h> // ajouter ou retirer de l'argent sur un compte inscrit dans un fichier int solde(char *argv); int main (int argc, char * argv[]){ printf("client: %s \n", argv[1]); pid_t a = fork(); if(a<0){ perror("Le fork a rater"); exit(EXIT_FAILURE);} if(a==0){ int option=0; while(option != 4){ printf("\033[H\033[2J"); printf("Voulez-vous: \n \t\t - Le solde (1) \n \t\t - Ajouter de l'argent (2) \n \t\t - Retirer de l'argent (3) \n \t\t - Fermer le programme (4)\n\n"); scanf("%d", &option); switch(option) { case 1: printf("Voici votre solde\n"); printf("Solde: %d",solde(argv[1]); break; case 2: printf("Combien voulez-vous ajoutez?\n"); break; case 3: printf("Combien voulez-vous retirez\n"); break; case 4: printf("Bonne journee\n"); break; default: printf("Option invalide !\n"); break; } } } wait(0); exit (0); } int solde(char *argv){ FILE * client; client = fopen(argv[1], "r"); // ouvrir en lecture if(client == NULL){ printf("Impossible d'ouvrir le fichier %s\n", argv[1]); exit(1); } // prend la somme stocker dans le fichier int nb; fscanf(client,"%d",&nb); // fermeture du fichier fclose(client); return nb; }
l'erreur:
ex10.c: In function 'main': ex10.c:28: error: parse error before ';' token ex10.c: In function 'solde': ex10.c:54: warning: passing arg 1 of 'fopen' makes pointer from integer without a cast
Merci d'avance !
A voir également:
- Ouvrir un fichier en lecture avec argv ?
- Comment ouvrir un fichier epub ? - Guide
- Comment ouvrir un fichier bin ? - Guide
- Ouvrir un fichier .dat - Guide
- Comment ouvrir un fichier docx ? - Guide
- Comment réduire la taille d'un fichier - Guide
5 réponses
Bonjour,
Déjà, il faut commencer par lire les messages du compilateur.
ex10.c: In function 'main':
ex10.c:28: error: parse error before ';' token
Que se passe-t-il ligne 28 avant le ; ?
printf("Solde: %d",solde(argv[1]); => Oubli d'une parenthèse.
D'ailleurs, la prochaine fois, si tu pouvais nous dire où se trouvent les lignes, ça nous éviterait de compter :-).
Autre erreur ligne 54 :
client = fopen(argv[1], "r"); // ouvrir en lecture
argv[1] est un caractère (argv est de type char* dans ta fonction).
D'où l'erreur. Essaie plutôt : fopen(argv, "r");
printf("Impossible d'ouvrir le fichier %s\n", argv[1]);
Même erreur.
j'aimerai que si je tape pierre.txt le compte pierre.txt soit afficher (d'autre option à venir)
même si possible (aucune idée comment faire) que si je tape "pierre" le compte pierre.txt soit débiter
Tu peux tester la présence d'un '.' dans le nom du fichier (strchr). S'il n'y est pas, tu rajoutes l'extension ".txt" à la fin (strcat/strncat).
Pour l'utilisation de plusieurs options, la bibliothèque argtable devrait t'intéresser.
Cdlt,
Déjà, il faut commencer par lire les messages du compilateur.
ex10.c: In function 'main':
ex10.c:28: error: parse error before ';' token
Que se passe-t-il ligne 28 avant le ; ?
printf("Solde: %d",solde(argv[1]); => Oubli d'une parenthèse.
D'ailleurs, la prochaine fois, si tu pouvais nous dire où se trouvent les lignes, ça nous éviterait de compter :-).
Autre erreur ligne 54 :
client = fopen(argv[1], "r"); // ouvrir en lecture
argv[1] est un caractère (argv est de type char* dans ta fonction).
D'où l'erreur. Essaie plutôt : fopen(argv, "r");
printf("Impossible d'ouvrir le fichier %s\n", argv[1]);
Même erreur.
j'aimerai que si je tape pierre.txt le compte pierre.txt soit afficher (d'autre option à venir)
même si possible (aucune idée comment faire) que si je tape "pierre" le compte pierre.txt soit débiter
Tu peux tester la présence d'un '.' dans le nom du fichier (strchr). S'il n'y est pas, tu rajoutes l'extension ".txt" à la fin (strcat/strncat).
Pour l'utilisation de plusieurs options, la bibliothèque argtable devrait t'intéresser.
Cdlt,
Merci fiddy. J'essaye d'écrire un truc mais les 2 idée qui me sont apparu sont bloquer j'ai en premier temps essayer de mettre argv dans une chaine de char mais rien à faire je trouve pas.
ensuite par cette manière là:
J'aurais pu faire comme ce bout de code que j'ai trouver:
Toujours sans succès alors j'ai voulu tester cela..:
bon la j'avoue sécher.
edit: pour mon dernier choix j'ai trouver.
pour mes autres je trouve intéressant de comprendre pourquoi je ne compile pas. Et ce que je pourrais faire pour y remédier
char fichier[22] = (char)argv[1]; printf("%s",fichier);
ensuite par cette manière là:
char fichier[22]; strcpy(nom, argv[1]); printf("%s",fichier);
J'aurais pu faire comme ce bout de code que j'ai trouver:
char image[22] = "dossier/"; char couleur[2] = "a"; char valeur[3] = "bc"; strcat(strcat(strcat(image, couleur), valeur), ".png"); printf("%s", image);
Toujours sans succès alors j'ai voulu tester cela..:
FILE * client; client = fopen((argv,".txt"), "r"); // ouvrir en lecture
bon la j'avoue sécher.
edit: pour mon dernier choix j'ai trouver.
client = fopen(strcat(argv,".txt"), "r");
pour mes autres je trouve intéressant de comprendre pourquoi je ne compile pas. Et ce que je pourrais faire pour y remédier
Tu as pris mes remarques en compte ? Tes problèmes sont-ils résolus ?
char fichier[22] = (char)argv[1];
printf("%s",fichier);
Ou as-tu tapé ces lignes ? Dans le main ou dans solde ? Pourquoi castes-tu en char ? Il faut utiliser strcpy/strncpy.
char fichier[22];
strcpy(nom, argv[1]);
printf("%s",fichier);
Même question, c'est tapé dans le main ou dans solde ? Car dans solde argv[1] représente 1 caractère et non une chaîne. De plus tu copies dans nom et pas dans fichier...
Et merci de donner systématiquement les erreurs du compilateur, ça aide énormément comme dit dans le premier post.
char fichier[22] = (char)argv[1];
printf("%s",fichier);
Ou as-tu tapé ces lignes ? Dans le main ou dans solde ? Pourquoi castes-tu en char ? Il faut utiliser strcpy/strncpy.
char fichier[22];
strcpy(nom, argv[1]);
printf("%s",fichier);
Même question, c'est tapé dans le main ou dans solde ? Car dans solde argv[1] représente 1 caractère et non une chaîne. De plus tu copies dans nom et pas dans fichier...
Et merci de donner systématiquement les erreurs du compilateur, ça aide énormément comme dit dans le premier post.
Il faut bien faire attention aux types, pointeur, pointeur de pointeur, tableau et types primitifs.
"char* argv[]" est un tableau de taille inconnu contenant des objets de type pointeur vers char. un pointeur de char est souvent une chaine de caractère.
Partant de là, si tu veux utiliser un nom pour un paramètre particulier de ta chaine de caractère, tu peux faire :
char * fichier=argv[1];
mais attention, il s'agit d'un "alias" c'est à dire que si tu modifie la chaine pointé par fichier, tu modifie la chaine de argv[1]. Si tu veux une chaine à part, il faut utiliser le strcpy mais ne pas oublier de dimensionner correctement ta variable "fichier", sinon, tu risque de ne pas récupérer tous les caractères.
etc.
Pour debugueur toi même, il faut que tu comprennes les messages du compilo. Première étape, aller voir la ligne indiquer.
Bionne chance
"char* argv[]" est un tableau de taille inconnu contenant des objets de type pointeur vers char. un pointeur de char est souvent une chaine de caractère.
Partant de là, si tu veux utiliser un nom pour un paramètre particulier de ta chaine de caractère, tu peux faire :
char * fichier=argv[1];
mais attention, il s'agit d'un "alias" c'est à dire que si tu modifie la chaine pointé par fichier, tu modifie la chaine de argv[1]. Si tu veux une chaine à part, il faut utiliser le strcpy mais ne pas oublier de dimensionner correctement ta variable "fichier", sinon, tu risque de ne pas récupérer tous les caractères.
etc.
Pour debugueur toi même, il faut que tu comprennes les messages du compilo. Première étape, aller voir la ligne indiquer.
Bionne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci à vous, j'ai résolu le problème. Je tente de gratter sur certain point de c. Je fait en fait un exo d'entrainement pour mon exam d'os de Lundi. Et vu que il demandera peut être quelque chose avec argv je préfère maitriser le sujet. 2eme étape de l'exercice un fichier log gerer par un second fils qui fonctionne en alternance avec une sémaphore. Je crois que après cela je serais prêt :3