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 :

Problème FICHIER en C !


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Student in Computer Science
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Student in Computer Science
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut Problème FICHIER en C !
    Bonjour,

    J'aurai une question concernant les fichiers en C, je m'explique...

    J'ai donc un menu proposant plusieurs actions de calculs et, une fois que l'utilisateur choisi une action, la réponse doit être répertorié dans un fichier que j'ai du créé au préalable (je le nommerai "Réponse").

    Donc je prends un exemple:
    L'utilisateur veut connaitre la réponse de la première action, cette première action c'est par exemple: "Calculer 3X3". Une fois qu'il a effectué son action, la réponse "9" va s'inscrire dans le fichier "Réponse".

    Jusque là, tout va bien, une fois que l'utilisateur choisi une action ET qu'il ferme le programme (et donc, le fichier se ferme aussi à l'aide de fclose), il peut aller voir sa réponse "9" dans le fichier "Réponse" qui s'affiche bien correctement.

    Mon problème c'est que j'aimerai que l'utilisateur puisse effectuer plusieurs actions à la fois. Donc j'ai créé ma boucle permettant au menu de se répéter, donc l'utilisateur peut choisir désormais de calculer l'action n°1: 3X3 et il peut choisir de calculer ensuite l'action n°2 qui est: 4X4. Une fois qu'il a choisi ces deux actions, il quitte le programme et va voir le fichier "Réponse" pour obtenir ses 2 réponses.

    C'est là que j'ai un big problème, la réponse 2 remplace dans mon fichier "Réponse" la réponse 1. J'ai donc pensé mettre des \n entre les réponses mais ce n'est vraiment pas pratique car si il ne choisit que de connaître la réponse à l'action n°2, lorsqu'il ira la voir dans le fichier "Réponse", elle sera décalé par apport au début (du aux \n). Je vous laisse imaginer si l'utilisateur choisi de connaitre la réponse de ma dernière action (oui j'ai 22 actions différentes ).... il devra aller voir tout en bas du fichier "Réponse" pour trouver sa solution ALORS que le fichier ne comporte QUE cette solution.
    PAR CONTRE, si l'utilisateur choisi de connaitre la solutions de toutes les actions présentées, alors là, aucun problèmes, toutes les réponses s'affichent correctement, avec un espace entre chaques...


    En espérant avoir été assé clair...
    Si quelqu'un savait me donner une solution à ce problème...
    Merci bien

  2. #2
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Bonjour,

    apparemment si j'ai bien compris en effectuant une action supplémentaire, la précédente est écrasée ? (un bout de code pourrait aider)

    Sinon, il y a des fonctions dans la librairie standard du C qui permettent de positionner ton curseur dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fseek(FILE* pointeurSurFichier, long deplacement, int origine);
    D'autres te permettent de connaitre la position du curseur dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long ftell(FILE* pointeurSurFichier);
    etc.

    Sinon tu as encore une autre solution, les appels systèmes (les mêmes noms de fonctions mais sans le f) si tu veux en savoir plus à ce niveau là demande.

    Bonne journée,

  3. #3
    Membre habitué
    Homme Profil pro
    Student in Computer Science
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Student in Computer Science
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut
    Salut,
    Merci pour ta réponse, voilà un exemple de code qui pourrait poser problème pour mon cas...

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <stdio.h>
    #include <stdlib.h>
    //Un simple menu pour l'exemple
    int menu() {
    	int choix=0;
    	while (choix < 1 || choix > 4) {
    		printf("1.Calculer 3X3");
    		printf("2.Calculer 4X4");
    		printf("3.Calculer 5X5");
                    printf("4.Quitter");
    	scanf("%d", &choix);
    	}
            if (choix <=3 && choix !=4)       /*Ma simple boucle permettant de répeter le menu jusq'à ce que l'utilisateur quitte le programme.*/
                main()
    return choix;
    }
     
     
    int main() {
    	FILE *Réponse;
    	Réponse = fopen("Réponse.dat", "w"); //J'ouvre mon fichier en mode écriture. Je le nomme 'Réponse"
     
    	switch (menu()) {
    		case 1:
    		fprintf(Réponse, "3X3=9 !");
    		break;
     
    		case 2:
    		fprintf(Réponse, "4X4=16 !");
    		break;
    		case 3:
    		fprintf(Réponse, "5X5=25 !");
    		break;
                    case 4:
                    return 0;
                    break;
    	}
    //Un simple switch inscrivant via le fprintf la réponse dans le fichier "Réponse"
    fclose(Réponse); /*Je ferme mon fichier afin qu'il sauvegarde les données reçues.*/
    }
    Je l'ai pas compilé car je suis sous Windows actuellement (je ne travaille que sous Linux), mais cette exemple de code représente bien mon problème... Si je cherche a avoir une seule solution, je l'obtiens une fois le programme fermé. Si je cherche a obtenir les 3 solutions ou 2 solutions, l'une remplace l'autre dans le fichier "Réponse" (comme tu l'as bien compris).

    Je n'ai pas très bien compris comment utilisé ta solution, pourras-tu me donner un exemple en prenant exemple sur le code ci-dessus ?

    Evidemment, ce n'est qu'un exemple de code donc on oublie la programmation défensive et tout le reste... :p


    Ce que je veux c'est: Si l'utilisateur ne choisit qu'une réponse, par exemple la réponse de l'action numéro 3, il doit voir dons son fichier Réponse ceci:
    Si l’utilisateur veut avoir les 3 réponse des 3 actions il devra voir ceci dans le fichier "Réponse":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    3X3=9 !
    4X4=16 !
    5X5=25!

    Merci bien !

  4. #4
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    tu utilises vraiment "w" dans ton code à l'ouverture du fichier ? essaie avec le mode "a+" sinon.

    Rappel :
    "r" : lecture seule. Vous pourrez lire le contenu du fichier, mais pas écrire dedans. Le fichier doit avoir été créé au préalable.
    "w" : écriture seule. Vous pourrez écrire dans le fichier, mais pas lire son contenu. Si le fichier n'existe pas, il sera créé.
    "a" : mode d'ajout. Vous écrirez dans le fichier, en partant de la fin du fichier. Vous rajouterez donc du texte à la fin du fichier. Si le fichier n'existe pas, il sera créé.
    "r+" : lecture et écriture. Vous pourrez lire et écrire dans le fichier. Le fichier doit avoir été créé au préalable.
    "w+" : lecture et écriture, avec suppression du contenu au préalable. Le fichier est donc d'abord vidé de son contenu, et vous écrivez et lisez ensuite dedans. Si le fichier n'existe pas, il sera créé.
    "a+" : ajout en lecture / écriture à la fin. Vous écrivez et lisez du texte à partir de la fin du fichier. Si le fichier n'existe pas, il sera créé.
    Sinon, c'est bien pour ça que je te parlais des fonctions pour positionner ton curseur, tu ne dis jamais à ton programme : "je veux que tu tronques ce que je te donne avec ce qui est déjà dans le fichier que je te donne".

  5. #5
    Membre habitué
    Homme Profil pro
    Student in Computer Science
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Student in Computer Science
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut
    Ça fonctionne parfaitement, merci !
    N'ayant pas encore vu les différents mode d'écriture au cour, je ne connaissais pas le "a+". Mais apparemment, c'est ce qu'il me faut.
    Mais maintenant, si je veux, lors de la prochaine réouverture du programme, que les anciennes données stockées dans le fichier "Réponse.dat" soit effacées, comme pourrais-je faire ? Ouvrir d'abord le fichier en "w" pour effacer le contenu puis le fermer et ensuite le ré ouvrir en "a+" pour réécrire dedans (ce qui me paraît peu commode) ?

    Merci d'avance

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Comment est-ce possible que cela puisse compiler ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (choix <=3 && choix !=4)       /*Ma simple boucle permettant de répeter le menu jusq'à ce que l'utilisateur quitte le programme.*/
                main()
    Je n'ai pas compris ce que tu cherches à faire ici...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Réponse = fopen("Réponse.dat", "w");
    Outre le caractère accentué dans la variable, qui est censé faire échouer la compilation, il faut toujours vérifier le retour de la fonction fopen avant de poursuivre le code. C'est un risque de crash en cas cas d'erreur d'ouverture.

  7. #7
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Avec ta façon de faire cela me semble assez délicat. En effet comme tu appelles ton main dans ton menu et inversement, tu passe forcément par la réouverture de ton fichier à chaque tour de boucle (d'ailleurs ce n'est pas très optimal, même si le coup du main() dans le menu c'est "joli").


    Il y a néanmoins peut-être une méthode assez simple. Tu peux peut-être utiliser un booléen que tu déclare globalement pour décrire ton premier passage dans ton main. (Attention, je ne te conseille pas d'utiliser une variable globale c'est vraiment moche, mais si tu ne veux pas modifier trop ton code tu peux faire ça je penses)

    par exemple :

    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
    24
    25
    26
    27
    28
    29
     
     
    /*facultatif
    #define JE_VAIS_BIEN_TOUT_VA_BIEN  0
    #define PREMIER_PASSAGE                 true
    #define DEJA_PASSE                         false*/
    bool mon_premier_passage = true;//OU PREMIER_PASSAGE;
     
     
    int menu()
    {
        [...]
        return truc;
    }
    int main()
    {
        if (mon_premier_passage == true ) //OU if (mon_premier_passage) OU if (mon_premier_passage == PREMIER_PASSAGE)
        {
            //ouverture avec w pour écraser en vérifiant le retour de fopen
            mon_premier_passage = false; // OU mon_premier_passage = DEJA_PASSE;
        }
        else
           //ouverture avec a+ pour tronquer en vérifiant le retour de fopen
     
        [...]
     
     
    return JE_VAIS_BIEN_TOUT_VA_BIEN;
    }

  8. #8
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    Salut effectivement il faut que tu nous expliques comment on peut en C mettre deux fois l'instruction main().
    Il y a quelque chose qui m'échappe...

  9. #9
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    main n'étant qu'une fonction particulière, ça ne me choque pas qu'on puisse l'appeler.
    De là à l'appeler vraiment, par contre j'y songerai jamais.

    Ton fichier est réouvert à chaque passage dans le mainm son contenu est écrasé, puis tu réécris dedans. Le fichier n'est fermé qu'à la fin de tous lse "main".

    Pourquoi, puisque tu veux réaliser une boucle, ne pas écrire une vraie boucle ?

    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
    24
    25
    26
    27
    28
    29
    30
    31
    int main()
    {
       // ouvrir fichier
     
       int choix = 0;
       do {
          printf("1.Calculer 3X3\n");
          printf("2.Calculer 4X4\n");
          printf("3.Calculer 5X5\n");
          printf("4.Quitter\n");
          scanf("%d", &choix);
     
          switch (choix) {
    		case 1:
    		fprintf(Réponse, "3X3=9 !");
    		break;
    		case 2:
    		fprintf(Réponse, "4X4=16 !");
    		break;
    		case 3:
    		fprintf(Réponse, "5X5=25 !");
    		break;
                    case 4:
                    break;
                    default:
                    printf("mauvais choix !\n");
    	}
       } while (menu != 4);
       /// fermer fichier
       return 1;
    }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  10. #10
    Membre habitué
    Homme Profil pro
    Student in Computer Science
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Student in Computer Science
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Par défaut
    Bonjour à vous,

    @jeroman: Comme dit précédemment, je n'ai pas cherché à compilé, j'ai juste donné un exemple se rapprochant le plus simplement possible de mon réel projet bien plus complet et qui compile ! Et j'ai bien utilisé la programmation défensive en utilisant if (réponse == NULL) alors message d'erreur plus return 0

    @Kaamui: Ha je n'avais pas pensé aux #DEFINE, merci je vais testé ça.

    @Mat.M: Bah en sachant que le main est une fonction ET vu que je n'ai pas encore eu le courage de modifier une grande partie de mon projet original, j'ai pensé faire un appel de cette fonction main dans ma boucle IF pour faciliter les choses :p Mais apparemment ça choque beaucoup de monde :p

    @Bousk: Mon main était déjà fort rempli, j'ai donc préferé utilisé une fonction pour le menu. Mais je vais en effet, refaire ma boucle

    Merci à vous en tout cas, problème résolu.

  11. #11
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Je veux pas faire mon chieur, mais ... un petit clic sur le bouton Résolu en bas du dernier message ?

    En tout cas content d'avoir pu aider. Et les #define c'est juste pour rendre le code plus compréhensible que les truc==false.

    Sur ce, bonne continuation.

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

Discussions similaires

  1. problème fichier usbehci.sys manquant
    Par brotelle dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 02/04/2006, 10h01
  2. [MySQL] upload : problème fichiers existants dans la bdd ?
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/02/2006, 11h29
  3. problème fichier devpak
    Par Myra67 dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 30/06/2005, 22h26
  4. [résolution de noms] [réseau] problème fichier hosts
    Par Aldo dans le forum Administration
    Réponses: 2
    Dernier message: 11/04/2005, 21h38
  5. [Debutant(e)] Problème fichier texte et vue
    Par solenn dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 21/07/2004, 09h23

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