Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide avec les fichiers

Sujet résolu
    30 juin 2020 à 1:32:13

    Bonsoir à tous,

    J'ai un petit problème que je n'arrive pas vraiment à résoudre du fait que je sais pas comment m'y prendre. Voici avant tout ma fonction pour ajouter des informations (tout marche parfaitement hein) : 

    void ajouterCombinaison(struct t_Match *tMatch, int *n, FILE* fichier) {
        int i;
    
        fichier = fopen("test.txt","a+");
    
    
        do {
            printf("Combien de matchs voulez-vous ajouter ? (max 10) : ");
            scanf("%d",n);
        }while((*n) < 1 || (*n) > 10);
    
        for(i=0;i<(*n);++i) {
                if(fichier != NULL) {
                    printf("\nMatch num%cro %d",130,i+1);
                    printf("\nDonner le nom de l'%cquipe %d : ",130,1);
                    scanf("%s",&(tMatch[i]).name_A);
                    printf("\nDonner le nom de l'%cquipe %d : ",130,2);
                    scanf("%s",&(tMatch[i]).name_B);
                    printf("\nDonner le gagnant entre (1 pour %cquipe 1, 2 pour %cquipe 2) : ",130,130);
                    scanf("%d",&(tMatch[i]).winner);
                    fprintf(fichier,"Match numero %d : Gagnant entre %s et %s : %d | ",i+1,(tMatch[i]).name_A,(tMatch[i]).name_B,(tMatch[i]).winner);
                } else {
                    printf("Impossible d'%ccrire dans le fichier\n",130);
                    exit(-1);
                }
        } fprintf(fichier,"\n");
    
        fclose(fichier);
    }

    La fonction remplit une structure d'un match : un match est composé du nom d'une équipe A et B (qu'on remplit) ; ensuite, on dit qui est le gagnant (1 pour A, 2 pour B). On écris ensuite ces infos avec un fprintf dans un fichier en mode a+

    Mon problème est le suivant :

    Je veux faire une fonction qui vérifie si le fichier est vide ou non, si il est vide alors il n'y a rien a vérifier. On écris les détails du (ou des) match(s) directement dans le fichier et on s'arrête là (chaque match est d'ailleurs séparé par un '|' et un espace juste après). Dès qu'on finit l'ajout, on saute une ligne après la boucle for pour dire qu'on a terminé la combinaison avec : 

    fprintf(fichier,"\n")

    Ce que je veux maintenant c'est vérifier si cette nouvelle ligne qu'on a ajouté dans le fichier est exactement pareille à celle d'avant dans le fichier. La seule condition c'est que le gagnant d'une équipe doit être la même pour afficher une erreur du genre "vous avez la même combinaison"

    Bon un exemple pour vous faire comprendre : 

    dans "test.txt" il y'a ces deux lignes (séparé par un saut de ligne évidement) : 

    Match numero 1 : Gagnant entre Lakers et Chicago : 1 | Match numero 2 : Gagnant entre France et Pacers : 2

    Match numero 1 : Gagnant entre Lakers et Chicago : 1 |  Match numero 2 : Gagnant entre France et Pacers : 2 

    La deuxième ligne qu'on a ajouté est donc invalide parce que Lakers est gagnante (1) et Pacers est gagnante aussi, sauf que c'est la même chose avec l'ancienne combinaison (donc la ligne d'avant)

    Maintenant un contenu valide :

    Match numero 1 : Gagnant entre Lakers et Chicago : 1 | Match numero 2 : Gagnant entre France et Pacers : 2

    Match numero 1 : Gagnant entre Lakers et Chicago : 2 |  Match numero 2 : Gagnant entre France et Pacers : 2

    Ici même si c'est les mêmes équipes, le résultat est différent (même un seul parmi 9 autres matchs, ça suffit pour dire que c'est valide)
    J'ai du coup pas besoin de vérifier le nom des équipes ou autre, puisqu'on va vérifier si la ligne N est identifique à celle d'avant (N-1) , mais uniquement le score. 
    Voilà, je cherche une idée sur comment je peux faire ça, j'avoue avoir lu et relu des cours sur les fichiers et j'ai essayé plein de truc mais j'ai échoué :/
    Merci!

    -
    Edité par aymendgk 30 juin 2020 à 1:46:58

    • Partager sur Facebook
    • Partager sur Twitter
      30 juin 2020 à 1:40:22

      Salut,
      Si ton problème n'est que de savoir si un fichier est vide ou non, consultes le lien suivant:
      http://public.iutenligne.net/informatique/algorithme-et-programmation/priou/LangageC/1732_lecture_non_squentielle__positionnement_par_fseek.html
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        30 juin 2020 à 1:44:55

        PierrotLeFou a écrit:

        Salut,
        Si ton problème n'est que de savoir si un fichier est vide ou non, consultes le lien suivant:
        http://public.iutenligne.net/informatique/algorithme-et-programmation/priou/LangageC/1732_lecture_non_squentielle__positionnement_par_fseek.html


        Salut

        Non j'ai déjà une fonction sur comment savoir si le fichier est vide ou non, ce que je veux savoir c'est comment comparer la ligne qu'on vient d'ajouter (donc la dernière ligne dans le fichier) avec celle de l'avant dernière. Si la dernière ligne est exactement la même que l'avant dernière, alors c'est invalide et on a une erreur. Si par contre elle est exactement pareil mais il y'a un changement de score, alors est elle valide. Tu peux relire les exemples?

        Merci

        • Partager sur Facebook
        • Partager sur Twitter
          30 juin 2020 à 2:43:21

          C'est comme si tu demandais de lire le fichier en reculant en partant de la fin? J'ai bien compris?
          Si tu sais te positionner où tu veux avec fseek() et si tu connais la longueur maximum de tes lignes, tu peux faire comme suit:
          en sachant la longueur du fichier, tu te positionnes à la fin moins environ deux lignes maximum et un peu plus.
          tu avances au premier fin de ligne qui ne devrait pas être le bon.
          Tu devrais pouvoir lire les deux lignes suivantes qui sont les deux dernières et les comparer.
          Je ne connais pas de fonction 'truncate' en C.
          edit:
          Plus précisément, tu peux lire l'équivalent de 3 à 4 lignes en mémoire dans un bloc )sauf s'il n'y a que deux lignes dans le fichier).
          Le dernier caractère lu devrait être '\n'.
          Tu recules devant ce caractère et tu te rends jusqu'au deuxième '\n' devant celui-ci.
          (s'il n'y a que deux lignes, tu te rends jusqu'au début du bloc)
          Le caractère qui suit chacun d'eux est le premier de la dernière et avant dernière ligne respectivement dans cet ordre.
          Tu sauves ces positions et tu peux faire la comparaison.

          -
          Edité par PierrotLeFou 30 juin 2020 à 3:52:34

          • Partager sur Facebook
          • Partager sur Twitter

          Le Tout est souvent plus grand que la somme de ses parties.

            30 juin 2020 à 10:15:02

            L'erreur se produit uniquement si la ligne qui vient d'être créée (et qu'on s'apprête à écrire dans le fichier) est parfaitement identique à la dernière ligne du fichier, c'est bien ça ?

            Pour gérer ça, je stockerais en permanence la dernière ligne dans une chaîne de caractères. Lorsqu'on vient de créer une nouvelle ligne à partir des données saisies par l'utilisateur, il suffit alors de comparer :

            Si nouvelle_ligne = derniere_ligne
                // Lignes identiques : on refuse
            Sinon
                // La nouvelle ligne peut être écrite
                écriture de la nouvelle ligne dans le fichier
                derniere_ligne <-- nouvelle_ligne
            • Partager sur Facebook
            • Partager sur Twitter
              30 juin 2020 à 17:11:18

              J'avais compris que l'avant dernière ligne était déjà dans le fichier. Si c'est le cas, il faut tout de même aller la chercher.
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                30 juin 2020 à 17:57:14

                Je crois que ce qu'aymendgk appelle l'avant-dernière ligne est la dernière ligne du fichier. Elle doit rester dans le fichier ! En effet, si jamais la ligne courante (qu'aymendgk appelle la dernière ligne) est la même, on ne l'écrit pas, donc il n'y a jamais deux fois de suite la même ligne dans le fichier de sortie. La dernière est unique, c'est la bonne.

                Tout ce qu'il faut, c'est conserver en mémoire la dernière ligne écrite dans le fichier.

                -
                Edité par robun 30 juin 2020 à 17:58:03

                • Partager sur Facebook
                • Partager sur Twitter
                  30 juin 2020 à 18:07:09

                  robun a écrit:

                  Tout ce qu'il faut, c'est conserver en mémoire la dernière ligne écrite dans le fichier.

                  Et si j'arrête l'application entre temps ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 juin 2020 à 18:15:24

                    Pourquoi voudrais-tu prévoir d'interrompre l'application en plein milieu du traitement ?

                    (J'ai l'impression que Pierrot et toi compliquez un problème simple. Pour moi, le programme doit faire la chose suivante : lire les données saisies par l'utilisateur et, pour chaque donnée, construire une ligne puis comparer celle-ci avec la ligne précédente ; si elles sont différentes, écrire la ligne dans le fichier et metre à jour la variable 'ligne précédente', sinon ne rien faire.)

                    -
                    Edité par robun 30 juin 2020 à 18:20:06

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 juin 2020 à 18:55:33

                      A quoi bon utiliser les fichiers dans ce cas ? y a qu'a tout mettre en mémoire ! Une application, c'est fait pour être arrêté quand on s'en sert plus.

                      Dans un programme qui tient la route, tu dois prévoir tout les cas de figure !

                      -
                      Edité par rouloude 30 juin 2020 à 18:56:51

                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 juin 2020 à 19:18:55

                        rouloude a écrit:

                        A quoi bon utiliser les fichiers dans ce cas ? y a qu'a tout mettre en mémoire ! Une application, c'est fait pour être arrêté quand on s'en sert plus.

                        Dans un programme qui tient la route, tu dois prévoir tout les cas de figure !

                        -
                        Edité par rouloude il y a 10 minutes

                        J'avais compris la même chose que rouloude. C'est pourquoi j'insistais sur le fait de relire la dernière ligne.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          30 juin 2020 à 20:22:19

                          rouloude a écrit:

                          A quoi bon utiliser les fichiers dans ce cas ?

                          Ben, pour les ré-utiliser plus tard, pardi ! Par exemple on peut imaginer un deuxième programme qui va prendre en entrée le fichier créé et calculer le classement du championnat. À ce deuxième programme, on demandera le nom du fichier de résultats, et zou ! il calculera le classement. Il faut donc avoir préalablement sauvegardé les résultats.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 juin 2020 à 20:49:20

                            Tu te fais un film, ce n'est pas a toi d'imaginer ce que va faire l'application et s'il y a une deuxième application qui utilise le fichier.  Ça c'est à aymendgk de le dire !

                            Si je disais ça c'est que tu ne veux pas arrêter l'application pour reprendre le travail plus tard. Toute application d'archivage de données doit pouvoir être arrêté, puis redémarrer le lendemain pour y ajouter de nouvelles données !

                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 juin 2020 à 21:02:32

                              C'est toi qui fais un film en supposant que le fichier créé en sortie ne servira à rien. Je ne faisais que donner un exemple de possibilité pour montrer qu'il n'est pas impossible que le fichier créé en sortie serve à quelque chose.

                              Ce n'est pas une application d'archivage de données : les données sont saisies par l'utilisateur par 'scanf'. Mais tu as raison : si le programme prévoie qu'on puisse compléter un fichier déjà créé, la variable 'dernière ligne' doit pouvoir être initialisée en lisant la toute dernière ligne du fichier déjà créé. Je ne crois pas que ça change la méthode que je proposais, et de toute façon ça semble être une extension possible du programme, mais c'est à aymendgk de le dire ! (s'il a prévu cette extension).

                              -
                              Edité par robun 30 juin 2020 à 21:02:59

                              • Partager sur Facebook
                              • Partager sur Twitter
                                30 juin 2020 à 21:08:21

                                robun a écrit:

                                C'est toi qui fais un film en supposant que le fichier créé en sortie ne servira à rien.

                                Je viens de t'expliqué pourquoi j'ai dit cela ! soit tu n'as pas lu ! soit tu n'as pas compris !

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 juin 2020 à 21:11:23

                                  Je n'ai pas compris l'objection « A quoi bon utiliser les fichiers dans ce cas ? ».

                                  Par contre, j'ai compris l'idée de vouloir interrompre la saisie et la reprendre plus tard en complétant le fichier de sortie. (Dans ce cas, on commence par lire les lignes du fichier jusqu'à arriver au bout, on initialise 'dernière_ligne' à la dernière qu'on a lue, et on peut effectuer la saisie des nouvelles lignes avec l'algorithme que j'ai proposé. Par contre je crois que le mode "a+" ne serait pas adapté.)

                                  -
                                  Edité par robun 30 juin 2020 à 21:16:54

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 juin 2020 à 22:51:58

                                    Attention aux films, le confinement n'est pas terminé. :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Le Tout est souvent plus grand que la somme de ses parties.

                                    Aide avec les fichiers

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown