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

Bibliothèque standard C Discussion :

Comment connaître par le code si un fichier est binaire ou texte


Sujet :

Bibliothèque standard C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut Comment connaître par le code si un fichier est binaire ou texte
    Bonjour,

    Dans mon programme en C, je manipule dans un traitement à la fois des fichiers textes et des fichiers binaires. Uniquement dans le cas de fichier texte je récupère un entête, dans le cas du fichier binaire j'ignore le traitement.
    Ma question est simple comment reconnais-t-on par le code qu'un fichier est binaire.
    Merci de votre support.

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    bonjour,

    heu, tout est binaire, si t as rien d autre ca va pas etre facile je pense.
    Tu ne peux pas te fier a ton entete, si elle est presente ou non.

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    tu peux éventuellement vérifier si tu n'as pas de '\n' ou '\r' ..

    Mais ça ne donnera pas 100%, juste 99%..

    Une autre possibilité est de tester par l'absurde :

    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
    n = 0
     
    pour tout caractère
       si caractère est
          non alpha
          non numérique
          non espace
              n = n +1
       fin si
    fin pour
     
    si n > 2% (5%, 10%, 25%, ???) de taille du fichier
        fichier binaire
    sinon
        fichier texte
    fin si

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par teuzadur Voir le message
    Dans mon programme en C, je manipule dans un traitement à la fois des fichiers textes et des fichiers binaires. Uniquement dans le cas de fichier texte je récupère un entête, dans le cas du fichier binaire j'ignore le traitement.
    Ma question est simple comment reconnais-t-on par le code qu'un fichier est binaire.
    Si les fichiers sont bien organisés, en principe, l'extension suffit, c'est fait pour.

    Sinon, il n'y a pas de méthode infaillible. Une analyse heuristique (histogramme des caractères, par exemple) montre une pointe pour '\n' dans les fichiers textes et pour 0 dans les fichiers binaires... (en principe, il n'y a pas de 0 dans un fichier texte).

    Sinon, il faut détecter l'entête en espérant qu'elle ne sera jamais présente par hasard dans un fichier binaire...

    Tout cela sent assez mauvais au niveau conception... Pourquoi l'extension n'est-elle pas fiable ?

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Merci pour vos réponses.
    Le problème de l'extension est que je n'en connais pas la liste à l'avance.

    J'ai trouvé ce code sur le net, je ne comprends pas tout ( surtout l'extrait avec le test < 0 ???????), d'autant plus que cela ne marche pas à tous les coups. Vous en pensez quoi de ce code ? Je vais creuser vos réponses.

    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
    BOOL IsBinary(char *NomFichier)
    {
    	char contenu[1000];
    	FILE *f=fopen(NomFichier,"rb");
     
    	// Ouverture du fichier a tester
    	if(f==NULL)
    	{
    		FILE *f=fopen(NomFichier,"r");
    		return -1;
    	}
     
    	// Boucle de lecture et de test sur 10 lignes du fichier
    	for(int i=0;i<10;i++)
    	{
    		memset(contenu,0,1000);
    		// lecture d'une ligne
    		fgets(contenu,1000,f);
    		// Si on detecte un caractère < 0 on suppose que le fichier est binaire
    		for(int j=0;j<(int)strlen(contenu);j++)
    		{
    			if(contenu[j]<0)
    			{
    				// fermeture du fichier
    				fclose(f); 
    				return (1);
    			}
    		}
    	}
     
    	// fermeture du fichier
    	fclose(f); 
    	return (0);
    }

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par teuzadur Voir le message
    Merci pour vos réponses.
    Le problème de l'extension est que je n'en connais pas la liste à l'avance.
    C'est quoi ce projet mal défini ?
    J'ai trouvé ce code sur le net, je ne comprends pas tout ( surtout l'extrait avec le test < 0 ???????), d'autant plus que cela ne marche pas à tous les coups. Vous en pensez quoi de ce code ? Je vais creuser vos réponses.
    Ce code est idiot. J'ai déjà expliqué comment faire. Fait le au lieu de perdre ton temps sur le net...

    Ca commencerait comme ça...
    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
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    #include <stdio.h>
    #include <string.h>
    #include <dirent.h>
    #include <assert.h>
    #include <stdlib.h>
     
    #define DBG 0
     
    #if DBG
    static void display (unsigned long const hist[])
    {
       size_t i;
       for (i = 0; i < 256; i++)
       {
          unsigned long n = hist[i];
          if (n > 0)
          {
             printf ("%3d : %5lu\n", (int) i, n);
          }
       }
    }
    #endif
     
    int is_bin (char const *path, char const *fname)
    {
       int bin = -1;
       size_t const size = strlen (path) + 1 + strlen (fname) + 1;
       char *fullname = malloc (size);
       if (fullname != NULL)
       {
          sprintf (fullname, "%s/%s", path, fname);
          printf ("%-40s", fullname);
          {
             FILE *fp = fopen (fullname, "rb");
             if (fp != NULL)
             {
                unsigned long hist[256] = { 0 };
                int c;
     
                while ((c = fgetc (fp)) != EOF)
                {
                   size_t i = (size_t) (unsigned char) c;
                   assert (i < 256);
                   hist[i]++;
     
                   /* a developper */
                }
    #if DBG
                display (hist);
    #endif
     
                fclose (fp);
     
                bin = hist[0] != 0;
             }
             free (fullname);
          }
       }
       return bin;
    }
     
    int main (void)
    {
       char const *path = "/util";
       DIR *dir = opendir (path);
       if (dir != NULL)
       {
          struct dirent *lecture;
     
          while ((lecture = readdir (dir)) != NULL)
          {
             char const *fname = lecture->d_name;
             printf ("%-20s", fname);
             int bin = is_bin (path, fname);
             if (bin == -1)
             {
                printf ("DIR");
             }
             else if (bin == 1)
             {
                printf ("BIN");
             }
             else
             {
                printf ("TXT");
             }
             printf ("\n");
          }
          closedir (dir);
       }
       return 0;
    }
    Sur mon répertoire 'util', c'est correct.
    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
     
    .                   /util/.                                 DIR
    ..                  /util/..                                DIR
    ASCII.EXE           /util/ASCII.EXE                         BIN
    cmt2.exe            /util/cmt2.exe                          BIN
    comments.exe        /util/comments.exe                      BIN
    gcover.bat          /util/gcover.bat                        TXT
    guard.exe           /util/guard.exe                         BIN
    indent              /util/indent                            DIR
    indent.bat          /util/indent.bat                        TXT
    make.bat            /util/make.bat                          TXT
    mp3-organizer.exe   /util/mp3-organizer.exe                 BIN
    new.exe             /util/new.exe                           BIN
    OUTILS.HD           /util/OUTILS.HD                         DIR
    renfile.exe         /util/renfile.exe                       BIN
    xdump.exe           /util/xdump.exe                         BIN
     
    Process returned 0 (0x0)   execution time : 0.474 s
    Press any key to continue.
    Cependant, il faudrait affiner l'heuristique (taux de '\n' et de ' ', par exemple...)

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Merci pour ta patience. Je vois que le code s'implémente de plus en plus.
    Pour l'instant je me prends la tête car même en créant un projet depuis 0 je n'arrive pas à le faire tourner, plantage sur "DIR".
    J'ai beau installer les .h à la main, genre <direct.h> mais rien à faire, ça marche pas. Je continue...fo dire que je suis développeur .NET et j'ai perdu la main sur ces subtilités.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par teuzadur Voir le message
    Merci pour ta patience. Je vois que le code s'implémente de plus en plus.
    Pour l'instant je me prends la tête car même en créant un projet depuis 0 je n'arrive pas à le faire tourner, plantage sur "DIR".
    J'ai beau installer les .h à la main, genre <direct.h> mais rien à faire, ça marche pas. Je continue...fo dire que je suis développeur .NET et j'ai perdu la main sur ces subtilités.
    J'utilise Code::Blocks et MinGW...

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/02/2007, 16h45
  2. Détecter si un fichier est binaire ou texte?
    Par Chekov dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/10/2006, 08h13
  3. Réponses: 2
    Dernier message: 15/09/2006, 12h07
  4. [DBGRID] Comment derouler par le code une picklist ?
    Par kase74 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/09/2004, 11h57
  5. Réponses: 5
    Dernier message: 15/04/2004, 13h24

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