Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec un fichier binaire.

Problème avec un fichier binaire.

    14 juillet 2019 à 17:46:31

    Bonjour à tous,

    Comme on peut le deviner du titre, mon problème est que j’ai cette focnction pour copier un fichier binaire dans un autre

    void CopyFiles::CopyFile(char fileSource[], char fileDest[])
    {
        cout << "source = " << fileSource << endl;
        cout << "destination = " << fileDest << endl;
    
        ifstream FichierSource;
        ofstream FichierDest;
        const int TAILLE = 255;
    
        FichierSource.open(fileSource, ios::in | ios::binary);
        if(FichierSource.is_open())
        {
            /*
            if(fseek(FichierSource, 0, SEEK_END) != -1){
                TAILLE = ftell(FichierSource);
            }
            } else {
                printf("Une erreur est survenue pendant le positionnement a la fin du fichier\n");
                TAILLE = -1;
            }
            */
            
            char Buffer[TAILLE];
            FichierDest.open(fileDest, ios::out |ios::binary);
            if(FichierDest.is_open())
            {
                int32_t a = 0;
                while(FichierSource.read((char*)Buffer, TAILLE))
                {
                    FichierDest.write((char*)Buffer, TAILLE);
                    a += TAILLE;
                }
                //cout << " aaa = " << a << endl;
                FichierDest.close();
            }
            FichierSource.close();
        }
    }



    Le programme s’exécute normalement, le fichier source est lu parfaitement, et le fichier destination est enregistré (enfin presque)

    • les fichier images s’enregistrent très bien,
    • les vidéos s’enregistrent mais VLC me demande toujours de les réparées avant de les lires
    • et enfin les fichier texte s’enregistrent mais ils sont vides.

    Alors SVP si vous avez une idée je vous serai vraiment très reconnaissant.

    • Partager sur Facebook
    • Partager sur Twitter
      14 juillet 2019 à 18:39:20

      Et comme cela :

      FichierDest << FichierSource.rdbuf();

      Si tu avais mis tes les deux paramètres de ta fonction comme constant const , ça t'aurais éviter ces vilains trantypages.

      PS : Il semblerait qu'il y ai une fonction copy_file depuis (c++17).

      -
      Edité par rouloude 14 juillet 2019 à 18:52:31

      • Partager sur Facebook
      • Partager sur Twitter
        14 juillet 2019 à 19:02:18

        Il y a 2 problèmes majeurs dans ton code:

        • L'utilisation de VLA qui n'est pas autorisé en C++. Ce qui veut dire que ton compilateur n'est pas bien configuré. char buf[size] est une VLA lorsque size n'est pas une valeur connue à la compilation. C'est d'ailleurs une bonne raison de ne pas utiliser les tableaux C et de préférer std::array.
        • Une allocation de la taille du fichier. Que va-t-il se passer avec des fichiers de 20Go si tu n'as que 16Go disponibles ? En plus, les VLAs ont un fonctionnement particulier et c'est bien possible que le code fasse n'importe quoi dans ce cas.

        Ensuite, il y a un problème dans la logique du code: ostream::write et istream::read lisent/écrivent tous les caractères demandés à moins de tombé sur un eof. Il n'y a aucune raison de faire une boucle.

        Les appels a close() sont également superflus.

        Et pour finir, selon le système et les options de compilation, les seek et compagnie ne dépassent pas 4Go. Donc pour faire simple, n'utilise pas seek et compagnie et passe par des std::streambuf/std::filebuf avec une lecture et une écriture par paquet.

        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2019 à 0:17:27

          Bonjour à tous les amis

          merci pour vos réponses rapides

          en fait, j'utilise cette fonction

          void CopyFiles::CopyFile(const char FileSrcRec[], const char FileDestRec[])
          {
              FILE *FileSrc, *FileDest;
              const int TAILLE = 2000;
              long lsizeLu = 0;
              char buffer[TAILLE_BUF];
          
              if((FileSrc = fopen(FileSrcRec, "rb")) == NULL)
              {
                  cout << "impossible d'ouvrir le fichier source";
                  exit(1);
              }
          
              if((FileDest = fopen(FileDestRec, "wb")) == NULL)
              {
                  cout << "impossible d'ouvrir le fichier destination";
                  exit(1);
              }
          
              while((lsizeLu = fread(buffer, 1, TAILLE, FileSrc)) != 0)
              {
                  fwrite(buffer, 1, lsizeLu, FileDest);
              }
          }

          et ça marche très bien

          pour l'instant je n'ai pas de fichier superieur à 4 GO, mais je penserai à votre solution le moment voulu.

          • Partager sur Facebook
          • Partager sur Twitter
            16 juillet 2019 à 9:27:08

            En fait, à part le fait que ce soit une fonction membre, ton code c'est du C.

            La prochaine fois tu peux poster dans le forum d'à côté :)

            Et j'ajouterai que si tu ne suis pas nos conseils j'ai du mal à voir l'intérêt de venir poser une question.

            -
            Edité par markand 16 juillet 2019 à 9:27:37

            • Partager sur Facebook
            • Partager sur Twitter

            git is great because Linus did it, mercurial is better because he didn't.

              16 juillet 2019 à 20:36:14

              Bonjour à tous,

              En fait j'ai besoin d'une solution rapide, c'est pour ça que je vais utiliser cette fonction, mais plus tard je vais tester vos solutions.

              merci beaucoup en tout cas.

              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2019 à 0:25:21

                En plus je n'ai même installer  (c++17).

                Et si vous avez une idée sur la procédure d'installation je suis preneur.

                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2019 à 14:34:01

                  Avec un peu de chance, le compilateur que tu emploie le supporte déjà, et il se peut même que ce soit la norme qu'il utilise par défaut.

                  La bonne question et donc "quel compilateur utilises-tu"?

                  Si tu utilise Gcc, tu peux accéder à la norme C++17 dés la version 6 (support partiel) ou la version 7 (support plein), et tu peux même disposer de certains éléments qui ne seront finalisés qu'en C++20 à partir des version 8 et 9 de Gcc.  Selon la version de Gcc, l'ajout de l'option -std=c++17 à la ligne de commande sera (peut-être) nécessaire pour en profiter ;)

                  Si tu utilise VisualStudio (version 2017 ou ultérieur), tu pourras disposer de la norme C++17 en ajoutant l'option /std:c++17 (voire -std:c++17) aux options de ton projets

                  Si tu utilise une version plus ancienne de Gcc (4.x, 5.x ou antérieure ) ou de visual studion (Vs 2015, ou antérieure), je serais déjà étonné de savoir où tu les as trouvés (si tu viens de les télécharger) ou si tu as envisagé de te mettre au développement "à l'époque", et que tu es passé à autre chose" (par manque de temps surement :D ).  Mais le conseil serait alors de ... te dépêcher de le mettre à jour.

                  Si tu veux télécharger une version récente de l'un ou de l'autre compilateur, cela se passe

                  Si tu dispose de code::blocks qui aurait été installé avec un compilateur trop ancien, tu peux utiliser ==>cette discussion<== pour savoir comment mettre le compilateur à jour

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                    21 juillet 2019 à 17:03:52

                    Bonjour koala01

                    Merci beaucoups pour tes eclaircissements, mais je travaille avec QtCreator et j'utilise MinGW comme compilateur, je suis a la versions 5.9.0 et et la version 4.3.01 de QtCreator.

                    et il ne reconnait pas les instructions du c++17.

                    Merci d'avance.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2019 à 21:56:39

                      1- Qt Creator n'est qu'un EDI (Environnement de Développement Intégré): un programme qui regroupe les outils nécessaires au développement tels que

                      • la suite de compilation (préprocesseur, compilateur, éditeur de liens, générateur d'archives pour les bibliothèques)
                      • un éditeur de texte avec des fonctions sympa de coloration syntaxique, de mise en page, et de recherche
                      • un  débuggeur
                      • un système de configuration et de gestion de projets

                      2- Comme tous les outils, il faut penser à les mettre à jour de temps en temps, et c'est d'autant plus vrai pour la bibliothèque Qt qui évolue en permanence énormément.

                      A l'heure actuelle, tu utilises un compilateur, un EDI et une version de Qt sans doute vieux de trois ans, ce qui est bien dommage.  N'hésite pas à mettre tes outils à jour, en installant la dernière version en date qui permet désormais de créer des applications 64 bits sous windows (Qt 5.13, Gcc 7.3.0, QtCreator 4.9.2), ta vie n'en sera que meilleure.

                      3- Sauf erreur, avec Gcc 5.9.x, tu devrais au minimum pouvoir disposer de la norme C++14 , même si, cette version de Gcc supporte par défaut C++98 : il "suffit"  d'ajouter l'option "qui va bien" à la ligne de commande.

                      Si tu utilises qmake (un fichier .pro) pour décrire ton projet, il te suffit d'ajouter l'option CONFIG += c++14

                      Si tu utilises déjà cmake pour décrire ton projet, il "suffit d'ajouter les lignes

                      set(CXX_STANDARD 14)
                      set(CXX_STANDARD_REQUIRED YES)
                      set(CXX_EXTENSIONS NO)

                      dans le fichier de fichier de configuration général

                      Tu peux essayer d'activer C++17 en remplacant la valeur 14 par 17 : dans le pire des cas, si le compilateur ne supporte pas cette norme, tu obtiendra un message d'erreur explicite ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                        22 juillet 2019 à 0:27:42

                        Que dois-je dire koala01,

                        Merci beuacoup pour tout ces informations, justement j'ai profié de mon dimanche pour télécharger la derniere version de Qt version 5.13.0 ainsi que QtCreator 4.9.0, je vais les installés et je te diendrai au courant.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 juillet 2019 à 17:16:09

                          Bonjour à tous et bonjour à toi koala01,

                          J'ai suivi tes conseils et j'ai installé Qt 5.13.0 et QtCreator 4.9.2

                          ça marche très bien,

                          sauf pour c++17 et c++14

                          Voici un exemple /

                          fichier pro

                          TEMPLATE = app
                          CONFIG += console c++11
                          CONFIG -= app_bundle
                          CONFIG -= qt
                          
                          CONFIG += c++14
                          
                          
                          SOURCES += \
                                  main.cpp
                          

                          et voici le main

                          #include <iostream>
                          
                          using namespace std;
                          
                          int main()
                          {
                              cout << "Hello World!" << endl;
                          
                          
                              unique_ptr<int> ptr1;
                              return 0;
                          }
                          

                          et enfin voici les erreurs : 

                          D:\Fichiers_applications\C++\Projets_QtCreator\Revision_c_plus_plus 07-06-2019\Pointeur_inteligents\main.cpp:11: erreur : 'unique_ptr' was not declared in this scope
                               unique_ptr<int> ptr1;
                               ^~~~~~~~~~

                          alors je n'ai pas compris pourquoi.

                          Merci de votre aide.



                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 juillet 2019 à 17:37:13

                            Attention, sauf erreur de ma part, il est possible d'obtenir Qt 5.13 sous des formes prévues pour fonctionner avec différentes version de Gcc.

                            Et, bien sur, on peut donc obtenir différentes version de Gcc au travers de l'installateur de Qt.

                            As tu bien veillé à prendre la version la plus récente possible de Gcc lors de l'installation ?

                            en ouvrant une invite de commande et en y lancant l'instruction

                            gcc -v

                            la dernière ligne renvoyée par cette commande devrait ressembler à

                            gcc version x.y.z (blablah)

                            Quelles sont les valeurs de x, y et z que tu obtiens : est-ce 5.3.0 ou 7.3.0?  Si c'est 5.3.0, c'est que tu t'es trompé en choisissant le compilateur :-°:p:'(


                            • Partager sur Facebook
                            • Partager sur Twitter
                            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                              26 juillet 2019 à 17:41:23

                              std::unique_ptr se trouve dans l'en-tête <memory>.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                26 juillet 2019 à 19:31:15

                                Tu as donc bien la version 7.3.0 de Gcc... Et, après lecture plus attentive de l'erreur indiquée, c'est effectivement parce que, pour pouvoir utiliser la classe std::unique_ptr, il faut d'abord inclure le fichier <memory> à ton programme (#include <memory>).  Autrement, le compilateur ne saura même pas que cette classe existe, ce qui provoque ton message d'erreur ;)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                                  26 juillet 2019 à 20:22:28

                                  Merci à tous,

                                  oui c'est vrai , le problème venait du #include<memory>

                                  même sans rajouter CONFIG += C++17 ou C++14 ça marche, merci à tous

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 juillet 2019 à 21:01:24

                                    Merci à tous,

                                    oui c'est vrai jo_link_noir, le problème venait du include<memory>

                                    même sans rajouter CONFIG += C++17 ou C++14 ça marche, merci à tous

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Problème avec un fichier binaire.

                                    × 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