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 :

fusion de fichier


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut fusion de fichier
    Bonjour,

    J'aimerai fusionner deux fichiers qui sont à l'origine issue du même fichier, mais qui ont perdu des paquets lors d'un transfert.
    Comme je ne perds pas tout le temps les mêmes paquets, j'aimerai faire un programme qui lit en entrée ces deux fichiers de manière binaire et qui les merge afin de sortir le fichier d'origine.

    Je pense que je peux lire mes fichiers sous forme binaire avec un fread mais après comment je fais pour faire un ou de manière binaire.

    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je n'ai pas très bien compris comment vous saurez que le paquet F vient après le paquet E et avant le paquet G.
    La "concaténation" de 2 fichiers est très simple
    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
    FILE *in1=fopen(Fic1,"rb");
    FILE *in2=fopen(Fic2,"rb");
    FILE *res=fopen(FicRes,"wb");
    while (!feof(in1))  
    {
       int c;
       if ((c=getc(in1)) != EOF) putc(c, res)
    }
    while (!feof(in2))  
    {
       putc(getc(in2),res); // là on écrit la fin de fichier
    }
    fclose(in1);
    fclose(in2);
    fclose(res);
    Reste à vérifier que les fichiers existent.
    Mais en fait rien ne dit que le résultat sera bon.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par xduris Voir le message
    J'aimerai fusionner deux fichiers qui sont à l'origine issue du même fichier, mais qui ont perdu des paquets lors d'un transfert.
    Comme je ne perds pas tout le temps les mêmes paquets, j'aimerai faire un programme qui lit en entrée ces deux fichiers de manière binaire et qui les merge afin de sortir le fichier d'origine.
    Il reste à résoudre le gros problème d'identification des paquets et de leur mise en ordre. Comme tu ne donnes rien à ce sujet, c'est pas facile de t'aider.

    Citation Envoyé par Pierre Dolez Voir le message
    La "concaténation" de 2 fichiers est très simple
    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
    FILE *in1=fopen(Fic1,"rb");
    FILE *in2=fopen(Fic2,"rb");
    FILE *res=fopen(FicRes,"wb");
    while (!feof(in1))  
    {
       int c;
       if ((c=getc(in1)) != EOF) putc(c, res)
    }
    while (!feof(in2))  
    {
       putc(getc(in2),res); // là on écrit la fin de fichier
    }
    fclose(in1);
    fclose(in2);
    fclose(res);
    A nouveau, l'idiome en C est de tenter la lecture et de vérifier si elle à échoué plutôt que d'utilise feof... La première boucle a le problème de devenir infinie si la lecture échoue -- timeout d'un système de fichier monté par le réseau p.e. --, la seconde en plus écrit le EOF sur le résultat, ce qui donnera un ÿ à la fin du fichier en plus (si interprété avec le code ISO-8859-1).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int c;  // pas char!
    while ( (c = getc(in1)) != EOF )
       putc(c, res);
    while ( (c = getc(in2)) != EOF )
       putc(c, res);
    Pour être blindé, on peut vérifier en prime qu'on est bien à la fin des fichiers plutôt qu'avec getc() retournant EOF à cause d'une erreur. Il faudrait aussi vérifier le résultat des putc (disque plein par exemple).

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, j'admets mon erreur.
    Je sais, j'ai de vieilles mauvaises habitudes.
    Je reconnais volontiers que j'ai plus l'habitude de lire des gros fichiers, correctes et que cette très mauvaise habitude d'écrire "while (!feof(in))" est synonyme pour moi de "for (;; )" ou "while (true)" qui est moins parlant pour moi.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci pour vos réponses.

    J'ai du mal m''exprimer car le bout de code que tu m'as donné me concatène mes 2 fichiers.
    Or moi je veux les fusionner, c'est à dire que je part du même fichier à l'origine qui a perdu des paquets en cours de téléchargement.

    Lorsque je le télécharge 2 fois par exemple il me manque le début du fichier lors du premier téléchargement et la fin lors du deuxième téléchargement.
    Ainsi je souhaite fussionner ces deux fichier (en faisant un 'ou binaire' bit à bit).

    Merci d'avance.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    La question est de reconstituer le fichier d'origine, donc de replacer correctement les morceaux (en supposant qu'ils sont tous présents dans au moins l'un des deux transferts).

    Si tu reçois une première fois ABCD et la deuxième fois EFGH, comment savoir si le fichier d'origine est ABCDEFGH ou EFGHABCD ou ...ABCD...EFGH... ou ...EFGH...ABCD... ?

    Si tu reçois ABCD et DEFGH , ce n'est pas sûr que le fichier d'origine soit ABCDEFGH, ce pourrait être aussi bien ...ABCD...DEFGH... ou ....DEFGH...ABCD...

    Il faut donc des informations supplémentaires sur le fichier d'origine (et/ou en ajouter pour le transfert) pour arriver à placer les morceaux à leur place (et savoir si il n'en manque pas).

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Mes fichiers corrompus font exactement la même taille que le fichier d'origine. Ils sont identiques sauf que les paquets perdus sont remplacés par des zéros. Quand j'ouvre mes fichiers dans un éditeur hexa j'ai ceci:

    Pour le fichier d'origine sous forme hexa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    3F 66 42 F6 8E 54 7C 6C D4 00 77 52 41 28 14 57
    57 14 48 53 21 41 12 51 24 12 47 63 34 DE F8 D7
     ...
    58 94 E8 A8 5F 42 16 47 D4 5D 84 D1 2A 14 13 62
    14 52 74 B2 E8 AA 34 52 95 6C EF 59 B2 D2 11 AC
    et pour le fichier qui a perdu des paquets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    3F 66 42 F6 8E 54 7C 6C D4 00 77 00 00 00 00 00 
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
     ...
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    00 00 00 B2 E8 AA 34 52 95 6C EF 59 B2 D2 11 AC
    Je pense qu'il est bien possible de comparer 2 fichiers qui ont perdus des paquets et de les fusionner. Ensuite pour tester s'il le fichier fusionné n'est pas corrompu j'ai un md5 du fichier original.

    Merci d'avance pour voter aide.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Imaginez que le fichier d'origine corresponde à un jeu de 52 cartes, et que ces cartes sont envoyées, une à la fois;
    Dans le cas normal, chaque carte est envoyée et reçue en tenant compte de l'ordre dans lequel elle ont été envoyées. C'est le protocole d'émission-réception qui règle ces problèmes.
    Il semble que dans votre cas, des cartes ont été perdues, et éventuellement renvoyées. Les chemins suivis pour acheminer des paquets de données peuvent être très divers et sont généralement inconnus (de l'utilisateur). Les différences de délai entre les différents chemins font que les paquets n'arrivent pas forcément dans le même ordre qu'ils sont partis, mais c'est le protocole de transmission qui organise cela.

    Je pensais que les pertes de données lors de transmission n'arrivaient plus. Si c'est le cas, il me parait impossible de récupérer et de réorganiser les paquets sans connaitre parfaitement le protocole de transmission (ce qui n'est pas mon cas). Et même dans ce cas où toutes les données sont arrivées, en seulement 2 transmissions, a moins d'avoir une idée très précise de ce que représente le fichier, j'imagine mal que l'on puisse réaliser l'opération que vous souhaitez.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Je suis d'accord sur le premier paragraphe. Toutes les cartes sont envoyées mais lorsque je les reçois j'en ai perdu 2 par exemple. je les ai pas toutes reçues dans l'ordre envoyé mais le protocole a réorganisé mon jeu de carte et à remplacer les 2 cartes manquantes par 2 cartes joker à la bonne place, celle des cartes perdues.

    Par contre je ne comprend pas pourquoi il n'est pas possible de retrouver le fichier de départ.

    Si mon fichier de départ sous forme hexa est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    16 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
    42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    et que lorsque je le télécharge pour la premier fois j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    16 27 28 29 00 00 00 00 00 00 00 00 00 00 00 41
    42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    et pour la deuxième fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    16 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
    42 00 00 00 00 00 00 00 00 00 00 00 00 55 56 57
    58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    Je ne comprends pas pourquoi je ne suis pas capable de retrouver mon fichier d'origine.

    Mon idée était la suivante.

    Ouvrir les fichier sous forme binaire
    Prendre le premier bit de chaque fichier qui a perdu des paquets
    Faire un 'ou binaire'

    Ensuite tester avec un md5 que mon fichier recomposé est bien le même que l'original car j'ai le md5 de l'original.

    Merci de votre aide.

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par xduris Voir le message
    Je ne comprends pas pourquoi je ne suis pas capable de retrouver mon fichier d'origine.
    Parce qu'en fait, tu fais déjà l'hypothèse que tes fichiers font quand même la même taille et que les paquets perdus sont remplacés par des zéros. Mais si tu obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
    16 27 28 29 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
    58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    À quel moment arrives-tu à détecter qu'il te manque effectivement des paquets ?

    D'autre part, dans les exemples que tu nous as donnés, comment détermines-tu a posteriori que les valeurs correctes à retenir sont les chiffres non-nuls du premier fichier et pas les « 00 00 00 00 » du second ?


    Cela dit, si ces deux critères peuvent être tenus pour acquis, c'est-à-dire que l'ordre des paquets est respecté, qu'un paquet manquant est détecté et comblé avec des zéros, alors tu as donné la réponse toi-même : un OU bit-à-bit te redonnera exactement le fichier original, si tant est qu'il n'ait pas de trou à un même endroit dans les deux fichiers. Mais c'est peu probable.

    En outre, il te faut vérifier la corruption éventuelle de tes données. S'il y a des valeurs qui sont non-nulles ne sont pas les bonnes, ton OU bit à bit échouera aussi.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Cela dit, si ces deux critères peuvent être tenus pour acquis, c'est-à-dire que l'ordre des paquets est respecté, qu'un paquet manquant est détecté et comblé avec des zéros, alors tu as donné la réponse toi-même : un OU bit-à-bit te redonnera exactement le fichier original, si tant est qu'il n'ait pas de trou à un même endroit dans les deux fichiers. Mais c'est peu probable.
    C'est ce que je souhaite faire mais je ne sais pas comment l'écrire en C.

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par xduris Voir le message
    C'est ce que je souhaite faire mais je ne sais pas comment l'écrire en C.
    Le OU bit-à-bit en C, c'est « | ».

    Donc :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    a = fgetc (fichier1);
    b = fgetc (fichier2);
     
    c = a | b;

    Mais comme je te l'ai dit, il est peu problable que tu obtiennes ce que tu cherches.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci je vais tester ça de suite et je te tiens au courant. (Ou peut être la semaine prochaine)!

  14. #14
    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
    Peut-être serait-il plus simple de retélécharger ce fameux fichier, non ? A moins que ce soit effectivement impossible.
    Car là, c'est quand même du bricolage.

    Le problème, comme cela a été dit, c'est comment distinguer un "00" normal d'un "00" de substitution. Et si par malheur tes deux téléchargements indiquent une série de "00" consécutifs au même endroit (cela peut éventuellement arriver), rien ne peut te dire si ces "00" sont des zéros normaux ou bien des "00" de substitution.
    Tout ceci fait que ton fichier original ne pourra peut-être pas être réparé à 100%.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Le problème, comme cela a été dit, c'est comment distinguer un "00" normal d'un "00" de substitution. Et si par malheur tes deux téléchargements indiquent une série de "00" consécutifs au même endroit (cela peut éventuellement arriver), rien ne peut te dire si ces "00" sont des zéros normaux ou bien des "00" de substitution.
    Tout ceci fait que ton fichier original ne pourra peut-être pas être réparé à 100%.
    Avec un md5

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 166
    Par défaut
    Merci à vous tous car ça marche!

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

Discussions similaires

  1. Fusion des fichiers son
    Par Abstract_cl dans le forum Audio
    Réponses: 9
    Dernier message: 25/08/2007, 14h18
  2. [JDOM] Fusion de fichiers XML
    Par rptmat57 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 18/07/2007, 11h37
  3. Réponses: 2
    Dernier message: 24/01/2007, 17h38
  4. fusion de fichiers XML et access 2003
    Par frdek dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 29/11/2005, 11h23
  5. [XSLT] Fusion de fichier XML ???
    Par webtheque dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/03/2005, 20h13

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