IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

fopen argument via la console


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut fopen argument via la console
    Bon(jour,soir), je débute en C et je souhaiterais via la console récupérer la chaine que l'utilisateur ecrit (moi) pour la passer en argument de fopen. Malheureusement je pense qu'il y a quelque chose de fondamental qui m'échappe, parce que ça foire en beauté, et que je m'y casse les dents depuis plusieures heures. J'ai fais énormément de recherches active, histoire de ne pas encombrer les forums mais je n'ai rien trouvé qui réponde à ma question (peut être est ce que je la formule mal)
    bref, je suis ouvert à toute nouvelle voie (en langage C) de mon future sauveur.

    Voici mon code foireux


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>
    #include <stdlib.h>
     
     
    int main(void)
    {
    	char chain[50];
    	FILE *fichier = NULL;
    	printf("Entrez le nom de fichier contenant la formule a analyser\n");
    	fgets(chain, sizeof(chain), stdin);
    	printf("le nom du fichier est : %s", chain);
    	fichier = fopen(chain, "w+");
    	if(fichier != NULL)
    	{	
    		fclose(fichier);
    		exit(EXIT_SUCCESS);
    	}
    	else
    	{
    		fprintf(stderr, "Impossible de lire le fichier %s en lecture\n", chain);
    		exit(EXIT_FAILURE);
    	}
    }
    P.S. je réclame votre indulgence c'est la première fois que j'utilise un forum en écriture. A noter également que la robustesse du code est nulle mais ce qui m'importe c'est de pouvoir faire la liaison entre "chain et fopen", je m'occupperai des tests après.

    D'avance merci pour le futur graal.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 106
    Billets dans le blog
    146
    Par défaut
    Bonjour,

    Petite remarque , le forum permet d'afficher du code clairement grace aux balises [ C O D E ] et [ / C O D E ] ( sans les espaces ), petit boutton '#' en haut quand tu ecrit un message. Si tu met ton code entre les balises ils sera coloré pour qu'on puisse mieux s'y repéré.

    Tu n'as pas vraiment précisé ton problème, donc je ne sais pas trop ce qui te pose problème, donc je ne sais pas trop quoi répondre.

    Juste que cela semble marcher ( au moins chez moi O_o ), et que je lui donne un nom et il va me crée un fichier si celui n'existe pas.
    Par contre la chaine de caractère récupéré à un caractère qui pose problème , donc il faut bien délimité la fin de la chaine avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chain[strlen(chain+1)] = '\0';
    juste après le printf

    ( Et il te faudra ajouter #include <string.h> en haut pour que la fonction strlen() soit trouvable )

    En espérant t'aider,
    N'hésite pas à demander si tu n'as pas compris ou si j'ai pas répondu au problème ( que je ne connais pas vraiment )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 462
    Par défaut
    Citation Envoyé par orezator Voir le message
    Malheureusement je pense qu'il y a quelque chose de fondamental qui m'échappe, parce que ça foire en beauté, et que je m'y casse les dents depuis plusieures heures.
    Citation Envoyé par LittleWhite Voir le message
    Juste que cela semble marcher ( au moins chez moi O_o ), et que je lui donne un nom et il va me crée un fichier si celui n'existe pas.
    Par contre la chaine de caractère récupéré à un caractère qui pose problème , donc il faut bien délimité la fin de la chaine avec ceci :
    Le code est presque parfait. La clé du mystère se trouve dans la man page de fgets() :

    fgets() lit au plus size - 1 caractères depuis stream et les place dans le buffer pointé par s. La lecture s'arrête après EOF ou un retour-chariot. Si un retour-chariot (newline) est lu, il est placé dans le buffer. Un caractère nul '\0' est placé à la fin de la ligne.

    Donc, le retour à la ligne est acquis en même temps que le reste et fait partie intégrante du nom de fichier. Certains systèmes n'aiment pas du tout cela. Il faut aller le retirer à la main.

  4. #4
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut remerciement
    Merci LittleWithe pour le conseil sur la lisibilité, je n'y manquerai pas la prochaine fois. Eh oui c'est vrai que je n'ai pas donné les feedbacks du code compilé (parce qu'il compilait le bougre), mais ce joyeux OS de windows me donnait un rapport d'erreur. Je préfère linux mais, j'aime aussi travailler en musique, et alsa n'est pas top avec mon laptop .

    Et donc pour conclure en phase prétest merci à toi Obsidian, car je pense qu'effectivement c'est ce retour chariot qui fait pèter une case à windows (c'est le cas de le dire), et une à moi aussi par la même occasion .

    Je m'en vais donc de ce pas implémenter une fonction qui boucle pour shooter ce "\0". Je vous tiens au courant de l'issue, quelle qu'elle soit.

  5. #5
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut,
    Citation Envoyé par orezator Voir le message
    Je m'en vais donc de ce pas implémenter une fonction qui boucle pour shooter ce "\0".
    Petit probleme d'interpretation: ce n'est pas \0 qu'il faut shooter (sinon ta chaine n'est plus valide) mais \n

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Regarde sur le forum et cherche la fonction fclean(), qui fait tout le travail nécessaire: Soit elle tronque la ligne (et vide l'excédant du buffer d'entrée) si on a saisi plus de 48 caractères, soit elle supprime le \n.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Inscrit en
    Février 2009
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 12
    Par défaut le problème est résolu :D
    Bonsoir, désolé d'avoir tardé pour ceux qui m'ont aimablement aidé, mais le problème étant résolu je me suis plongé dans mon code pour ... en trouver d'autres.
    C'est ça qui est génial en programmation c'est que le niveau des problèmes rencontrés croissent en même temps que le niveau du programmeur :p.
    Mais heureusement toujours avec comme constante la cohérence logique chère à nos ordinateurs.

    Vive la vie et merci.


  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 462
    Par défaut
    Citation Envoyé par orezator Voir le message
    toujours avec comme constante la cohérence logique chère à nos ordinateurs.
    Certaines fois, on se demande, quand même !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 28/02/2007, 19h14
  2. Faire passer des arguments via window.open()
    Par juanqui dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/02/2007, 19h27
  3. Script des modifications effectuées via la console
    Par secdeouf dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/10/2006, 19h28
  4. Lancer un programme avec des arguments via IE...
    Par petozak dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 24/03/2006, 11h51
  5. Jobs et Events via la console OEM
    Par Tahiri Ahmed dans le forum Entreprise Manager
    Réponses: 3
    Dernier message: 29/11/2004, 16h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo