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 :

découper fichier pour le copier


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut découper fichier pour le copier
    Bonjour, je cherche à écrire un programme qui copierait un fichier assez lourd. Si j'utilise un seul char* le programme crache donc j'ai fait une boulce, mais le problème c'est que les fichier font pas exactement la même taille au final et je comprend pas pourquoi.(même si le mp3 marche)
    Si quelqu'un pouvait m'aider j'en serais reconnaissant. Merci d'avance.
    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
    #include <fstream>
    #include <iostream>
    #include <windows.h>
     
    using namespace std;
     
    int main(int argc, char** argv)
    {
      fstream fichier("a.mp3", ios::in |ios::out | ios::binary);
      fstream fichier2("b.mp3", ios::in |ios::out | ios::binary | ios::trunc);
      if(fichier)
        {
          fichier.seekg(0, ios::end);
          int size = fichier.tellg();
          fichier.seekg(0, ios::beg); 
          int i= size/5000;
          int r= size%5000;
          int j=0;
          while(j<=i)
    	{
    	  char contenu[5000];
    	  fichier.read(contenu, 5000);
    	  fichier2.write(contenu, 5000); 
    	  j++;
    	}
          if(r!=0)
    	{
    	   char contenu[r];
    	  fichier.read(contenu, r);
    	  fichier2.write(contenu, r); 
    	}
          fichier.close();
          fichier2.close();
        }
      else
        cerr << "Error: " << strerror(errno);
     
      Sleep(5000);
      return 0;
    }

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    char contenu[r]; n'est pas une syntaxe valide en C++ mais un VLA C.
    while(j<=i) me parait faux et la boucle devrait être sur < uniquement. Je suppose que le fichier destination est plus important que l'original donc ?
    Une boucle for serait aussi plus maline, ne serait ce que pour ne pas avoir un j inutile qui traîne dans la portée par la suite.
    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.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    mon dieu que je suis bète merci bien

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, tu devrais abandonner l'idée d'utiliser un char * pour la représentation de tes données. Si tu veux manipuler un tableau de taille fixe (connue à la compilation), utilise std::array, et si tu veux un tableau de taille dynamique (connue à l'exécution), utilise std::vector.

    En effet, tu as déjà un problème au niveau de char contenu[r]; : comme r n'est connu qu'à l'exécution, tu essayes d'utiliser une technique qui n'existe qu'en C (et qui est refusée en C++) appelée les VLA. D'ailleurs, il me semble que la norme C est revenue sur ses pas en ce qui concerne cette fonctionnalité, et que la dernière norme ne les accepte plus...

    Mais, pour répondre à ta question je dirai simplement "vérifie ta logique", entre autres, au niveau de ta condition d'arrêt pour ta boucle while... Je n'en dirai pas plus, histoire de te laisser chercher un peu, mais, essaye de suivre ta logique pour, mettons, size() = 15255, et tu trouveras surement ta solutions
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 83
    Points : 56
    Points
    56
    Par défaut
    merci bien pour ces précisions, je connaissais pas vla.

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est encore expérimental, mais copier un fichier serait mieux via un appel à copy_file, ou via les API spécifiques à chaque système, ou Boost qui les encapsule etc.
    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.

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

Discussions similaires

  1. [Toutes versions] Copier un fichier pour sauvegarde
    Par willou-78 dans le forum VBA Access
    Réponses: 5
    Dernier message: 05/08/2021, 08h30
  2. Réponses: 2
    Dernier message: 21/02/2018, 10h37
  3. commande sed pour découper fichier
    Par wanbihan dans le forum Linux
    Réponses: 8
    Dernier message: 05/06/2012, 14h27
  4. [XL-2007] Récupération des valeurs d'un fichier pour les copier dans un autre
    Par stelme dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 05/11/2011, 06h00
  5. Comment attendre la création d'un fichier pour le copier
    Par nicolas2603 dans le forum VBA Access
    Réponses: 3
    Dernier message: 13/03/2008, 11h57

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