Ouvrir un fichier en lecture avec argv ?

Fermé
linquisiteur - 22 août 2013 à 18:55
 linquisiteur - 23 août 2013 à 12:48
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:

#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:

5 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
22 août 2013 à 21:00
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,
0
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.

 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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
23 août 2013 à 09:34
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.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
23 août 2013 à 12:39
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
0

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

Posez votre question
linquisiteur
23 août 2013 à 12:48
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
0