Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ecrire le contenu d'un buffer dans un fichier

Sujet résolu
    5 janvier 2022 à 17:27:59

    .

    -
    Edité par BastienCat 17 janvier 2022 à 18:49:35

    • Partager sur Facebook
    • Partager sur Twitter
      5 janvier 2022 à 17:47:09

      Yo,

      Tu as un fopen() puis un fprintf(), ces fonctions ne font pas leur boulot ?
      La première chose à faire c'est de vérifier les valeurs de retour de ces deux fonctions. Tu peux aussi utiliser perror() pour en savoir + sur le problème s'il y en a un.

      EDIT: La variable buffer (ligne 24) est de type "tableau de pointeurs", ce n'est pas ce qu'attend fprintf() !

      PS: il te manque un free(), mais ton malloc() est peut-etre inutile
      const char *str = "je suis une string";

      -
      Edité par Gam' 5 janvier 2022 à 17:49:54

      • Partager sur Facebook
      • Partager sur Twitter
        5 janvier 2022 à 18:03:33

        BastienCat a écrit:

        Voici mon code:

        	
        	struct sockaddr_in server_addr, client_addr;
        	server_addr.sin_family = AF_INET;
        	server_addr.sin_port = htons(server_port);
        	server_addr.sin_addr.s_addr = inet_addr(server_ip);
        	

        Vu qu'on n'est plus en 1989, je recommanderai plutôt la forme moderne (hum, depuis longtemps...) d'initialisation des structures en C

        struct sockaddr_in server_addr = {
            .sin_family      = AF_INET,
            .sin_port        = htons(server_port),
            .sin_addr.s_addr = inet_addr(server_ip)
        };
        


        qui a plusieurs avantages

        • moins verbeuse
        • plus lisible
        • initialise les autres champs à 0

         Il y a d'ailleurs, si je me rappelle bien, une fonction de bibliothèque qui fait ça beaucoup mieux (fonctionne avec des adresses IPv4 et IPv6)

        PS: getaddrinfo.

        Ah oui j'ai retrouvé un document https://www.mbillaud.fr/notes/sockets-ipv6.html

        -
        Edité par michelbillaud 5 janvier 2022 à 18:23:27

        • Partager sur Facebook
        • Partager sur Twitter
          5 janvier 2022 à 18:23:43

          Salut, inutile de déclarer un pointeur pour stocker le chemin d'accès à ton fichier :

          fpreadme = fopen("/home/user/Bureau/INFO_FOR_DECRYPT.txt","w");


          fprintf() attend une chaîne formatée et une adresse vers UNE chaîne, or ici buffer est un tableau de pointeurs, il faut donc appeler fprintf() dans une boucle pour chaque pointeur, ça ressemblerait à ça :

          for(int i=0; i<10; i++)
          {
              fprintf(fpreadme, "%s\n", buffer[i]);
          }



          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2022 à 23:53:03

            Salut salut, pour répondre dans l'ordre:

            Gam, effectivement le malloc était inutile. Le fprintf me renvoie une erreur de type segmentation fault quand j'essaye d'écrire le contenu de mon buffer dans le fichier.

            Michelbillaud, ce code m'est imposé, je ne peux pas le modifier mais merci de la précision :)

            KevinGL, j'ai essayé de faire une boucle mais j'ai une erreur de type segmentation fault. Une idée d'où vient cette erreur ?

            -
            Edité par BastienCat 6 janvier 2022 à 0:04:16

            • Partager sur Facebook
            • Partager sur Twitter
              6 janvier 2022 à 9:37:49

              Bonjour,

              la première des choses à faire est d'écrire des fonctions …

              Par exemple si tu as une fonction du genre :

              int dump_buffer_to_file(size_t bufsize, const char *buffer[static bufsize], FILE *file)
              {
                  ....
              }

              tu peux la tester simplement à part de ton programme … genre :

              char buffer[]="Hello world !";
              FILE *file=fopen(....);
              
              dump_buffer_to_file(sizeof buffer, buffer, file);

              Pour savoir d'où vient un segfault (qui est en général un problème de gestion mémoire accès/allocation/libération/…) il faut utiliser un debuger après avoir compilé ton projet en mode debug (option -g avec gcc et clang).

              Une autre méthode est d'utiliser un memory profiler comme valgrind (toujours parès avoir compilé ton programme en mode debug) :

              valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./mon_programme

              Il te donnera toutes les infos nécessaire sur l'erreur, comment et où elle se produit, etc …





              • Partager sur Facebook
              • Partager sur Twitter
                6 janvier 2022 à 9:56:24

                Tu as un buffer de type tableau de pointeur. C'est que tu reçois des pointeurs par ton socket ? Ils vont pointé où ? Réfléchi un peu !
                • Partager sur Facebook
                • Partager sur Twitter
                  6 janvier 2022 à 10:14:02

                  Sans doute parce que tes pointeurs ne sont pas initialisés
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 janvier 2022 à 10:16:57

                    KevinGL a écrit:

                    Sans doute parce que tes pointeurs ne sont pas initialisés

                    Comment un pointeur reçu sur un socket peut-il être initialisé ! 

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 janvier 2022 à 10:37:10

                      rouIoude a écrit:

                      KevinGL a écrit:

                      Sans doute parce que tes pointeurs ne sont pas initialisés

                      Comment un pointeur reçu sur un socket peut-il être initialisé ! 


                      Cherche du côté de recvfrom() ...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 janvier 2022 à 10:41:54

                        KevinGL a écrit:

                        Cherche du côté de recvfrom() ...

                        Mais qu'est ce que tu racontes, tu t'égares, relit bien les posts précédent ! 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 janvier 2022 à 10:51:08

                          Où tu veux en venir exactement ? Je constate juste que les pointeurs ne sont pas initialisés, à moins que ce soit le rôle de recvfrom() mais ça je n'en sais rien, ça fait 10 ans que je n'ai pas touché aux sockets
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 janvier 2022 à 10:57:50

                            KevinGL a écrit:

                            Où tu veux en venir exactement ? Je constate juste que les pointeurs ne sont pas initialisés, à moins que ce soit le rôle de recvfrom() mais ça je n'en sais rien, ça fait 10 ans que je n'ai pas touché aux sockets

                            Alors pourquoi répond tu a la question ? Quand on sait pas on s'abstient ! (Ma question est destiné au PO)

                            Tu vois bien quand même que ça n'a pas de sens d'envoyer des pointeurs par socket, on se demande si tu sais ce qu'est un pointeur ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 janvier 2022 à 11:06:06

                              Du calme ...

                              J'essaie d'aiguiller le PO voilà tout. Il faut s'assurer que recvfrom() attend bien un tableau de pointeurs parce que si ce n'est pas le cas ça va créer des problèmes lors du déférencement.

                              Oui je sais ce qu'est un pointeur ne t'inquiète pas pour ça ;)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 janvier 2022 à 11:16:22

                                recvfrom n'est pas difficile, tu peut lui envoyer tout ce que tu veux !

                                Mais explique moi comment un pointeur reçu par un socket peut-il être valide ? 

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 janvier 2022 à 11:19:36

                                  Tu parles d'allocation dynamique ? Je comprends pourquoi tu t'es énervé, j'ai parlé de recvfrom() alors que la solution serait plutôt du côté de malloc(), à moins que recvfrom() attende une simple chaîne de caractères, auquel cas on n'a pas nécessairement besoin de pointeurs

                                  -
                                  Edité par KevinGL 6 janvier 2022 à 11:26:16

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 janvier 2022 à 11:53:46

                                    Je pense que ce que Rouloude essaye d'expliquer est que le PO s'est trompé en déclarant le buffer comme un tableau de pointeurs sur char et qu'il voulait sans doute le déclarer comme un tableau de char …

                                    Communiquer la valeur d'un pointeur hors son contexte d'exécution est une erreur si le receveur désire l'utiliser par la suite.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 janvier 2022 à 11:57:50

                                      White Crow a écrit:

                                      Je pense que ce que Rouloude essaye d'expliquer est que le PO s'est trompé en déclarant le buffer comme un tableau de pointeurs sur char et qu'il voulait sans doute le déclarer comme un tableau de char …

                                      Exactement !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 janvier 2022 à 12:21:18

                                        Donc c'est bien ça, pas besoin de pointeur dans ce cas et pour l'écriture dans le fichier un seul appel vers fprintf() suffit
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 janvier 2022 à 13:28:51

                                          Si ce qui a été envoyé est bien le contenu de la chaîne, et pas son adresse dans l'espace mémoire de l'envoyeur ....

                                          (Je me méfie)

                                          -
                                          Edité par michelbillaud 6 janvier 2022 à 13:29:59

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 janvier 2022 à 16:54:34

                                            Ça sent le ransomware.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            l'azerty est aux dispositions ce que subversion est aux SCM

                                              6 janvier 2022 à 22:54:30

                                              Ah ? Ça sent pas grand chose vu le niveau …

                                              Du vaporware ?

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Ecrire le contenu d'un buffer dans un fichier

                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                              • Editeur
                                              • Markdown