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 :

fscanf vs ReadFile


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut fscanf vs ReadFile
    Bonjour,

    Je programme sous windows pour un programme uniquement pour windows.

    Il y a deux fonction d'accès aux fichiers, d'une part la fonction "C" fscanf et d'autre part la fonction de l'API windows ReadFile.

    Actuellement j'utilise ReadFile sans grands résultats, mais la question est surtout lequel utiliser? Et pourquoi ? Partager un fichier entre application ?

    Pouvez-vous me faire partager votre exprerience sur la chose ?


  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Je ne connais pas ReadFile, mais je connais fscanf, qui est une fonction très puissante, et que donc j'utilise régulièrement.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Pikwik
    Il y a deux fonction d'accès aux fichiers, d'une part la fonction "C" fscanf et d'autre part la fonction de l'API windows ReadFile.
    Il y a aussi fread et fgets qui sont plus sûres que fscanf...

    Jc

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    ReadFile fait une lecture binaire du fichier, si ce sont des fichiers texte, utilise la fonction "C" fgets bien plus pratique.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Voici un petit example de code utilisant ReadFile sous Windows.

    Je vous invite à me corriger étant donné mon manque d'experience en C, surtout pour les comportements indéfinit.

    EDIT: Ce bout de code met le fichier en mémoire.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
     
    #define READ_BUFFER_SIZE 255
    #define INIT_BUFFER_SIZE 255
     
    int main()
    {
        HANDLE hConfFile;
     
        char *FileBuffer = malloc(INIT_BUFFER_SIZE * sizeof(char));
     
        if (FileBuffer == NULL) {
                printf("Impossible d'allouer la mémoire initiale");
                exit(EXIT_FAILURE);
        }
     
        int bResult;
     
        long lBufferSize = INIT_BUFFER_SIZE;
        long lReaded = READ_BUFFER_SIZE;
        long lTotalChar = 0;
     
        char sBuffer[READ_BUFFER_SIZE];
     
        //Chemin vers n'importe quel fichier de votre choix.
        char const *confFileName = "C:\\Program Files\\Privoxy\\config.txt";
     
        hConfFile = CreateFile( confFileName,
                                GENERIC_READ,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);
     
        if (hConfFile == INVALID_HANDLE_VALUE)
        {
            printf("Impossible d'ouvrir le fichier (error %d)\n", GetLastError());
            return 0;
        }
     
        while ( bResult && lReaded > 0 ) {
            ZeroMemory(sBuffer, sizeof(sBuffer));
            bResult = ReadFile( hConfFile, &sBuffer, READ_BUFFER_SIZE - 1, &lReaded, NULL);
     
            lTotalChar += lReaded;
     
            //Si on est juste en taille on agrandit le buffer de fichier.
            if ( lTotalChar + 2 > lBufferSize ) {
                    lBufferSize = lBufferSize * 2;
                    FileBuffer = realloc(FileBuffer, lBufferSize * sizeof(char));
                    if ( FileBuffer == NULL ) {
                            printf("Impossible d'allouer plus de mémoire");
                            exit(EXIT_FAILURE);
                    }
            }
            sBuffer[254] = 0;
            strcat(FileBuffer, sBuffer);
        }
     
        printf("\nJ'ai lu %d caractères\n", lTotalChar);
        printf("Le FileBuffer Fait : %d caractères\n",  lBufferSize);
     
        //On réalloue la mémoire au plus juste.
        FileBuffer = realloc(FileBuffer, (lTotalChar) * sizeof(char));
        if ( FileBuffer == NULL) {
                printf("Impossible de réalouer la mémoire.");
                exit(EXIT_FAILURE);
        }
        FileBuffer[lTotalChar+1] = 0;
        printf("%s", FileBuffer);
     
        CloseHandle(hConfFile);
        free(FileBuffer); FileBuffer = NULL;
        return 0;
    }

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Commence par faire un do-while à la place du while parce que pour le moment, bResult n'est pas défini lors de la première itération...

    Jc

  7. #7
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    Revoici le code avec la correction :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <string.h>
     
    #define READ_BUFFER_SIZE 255
    #define INIT_BUFFER_SIZE 255
     
    int main()
    {
        HANDLE hConfFile;
     
        char *FileBuffer = malloc(INIT_BUFFER_SIZE * sizeof(char));
     
        if (FileBuffer == NULL) {
                printf("Impossible d'allouer la mémoire initiale");
                exit(EXIT_FAILURE);
        }
     
        int bResult;
     
        long lBufferSize = INIT_BUFFER_SIZE;
        long lReaded;
        long lTotalChar = 0;
     
        char sBuffer[READ_BUFFER_SIZE];
     
        //Chemin vers n'importe quel fichier de votre choix.
        char const *confFileName = "C:\\Program Files\\Privoxy\\config.txt";
     
        hConfFile = CreateFile( confFileName,
                                GENERIC_READ,
                                0,
                                NULL,
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL,
                                NULL);
     
        if (hConfFile == INVALID_HANDLE_VALUE)
        {
            printf("Impossible d'ouvrir le fichier (error %ld)\n", GetLastError());
            return 0;
        }
     
        do {
            ZeroMemory(sBuffer, sizeof(sBuffer));
            bResult = ReadFile( hConfFile, &sBuffer, READ_BUFFER_SIZE - 1, &lReaded, NULL);
     
            lTotalChar += lReaded;
     
            //Si on est juste en taille on agrandit le buffer de fichier.
            if ( lTotalChar + 2 > lBufferSize ) {
                    lBufferSize = lBufferSize * 2;
                    FileBuffer = realloc(FileBuffer, lBufferSize * sizeof(char));
                    if ( FileBuffer == NULL ) {
                            printf("Impossible d'allouer plus de mémoire");
                            exit(EXIT_FAILURE);
                    }
            }
            sBuffer[254] = 0;
            strcat(FileBuffer, sBuffer);
        } while ( bResult && lReaded > 0 );
     
        printf("\nJ'ai lu %ld caractères\n", lTotalChar);
        printf("Le FileBuffer Fait : %ld caractères\n",  lBufferSize);
     
        //On réalloue la mémoire au plus juste.
        FileBuffer = realloc(FileBuffer, (lTotalChar) * sizeof(char));
        if ( FileBuffer == NULL) {
                printf("Impossible de réalouer la mémoire.");
                exit(EXIT_FAILURE);
        }
        FileBuffer[lTotalChar+1] = 0;
        printf("%s", FileBuffer);
     
        CloseHandle(hConfFile);
        free(FileBuffer); FileBuffer = NULL;
        return 0;
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Pikwik
    Voici un petit example de code utilisant ReadFile sous Windows.
    Quel intérêt d'utiliser tout ce cirque ? A moins que tu n'y sois contraint, commence par utiliser les fonctions standards...

    fopen(), fread(), fclose()...

    http://emmanuel-delahaye.developpez....s.htm#fichiers
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define BUFFER_SIZE 128
     
    #define DBG 1 /* 0 | 1 */
     
    int main()
    {
       //Chemin vers n'importe quel fichier de votre choix.
       char const *filename = "corbeau.txt";
       FILE *fp = fopen (filename, "r");
       if (fp != NULL)
       {
          size_t buffer_size = BUFFER_SIZE;
          char *buffer = malloc(buffer_size);
          if (buffer != NULL)
          {
             int nb_read;
             size_t w = 0;
     
             while ((nb_read = fread(buffer + w, 1, BUFFER_SIZE - 1, fp)) == BUFFER_SIZE - 1)
             {
                void * tmp = realloc (buffer, buffer_size + BUFFER_SIZE);
     
    #if DBG
                buffer[w + nb_read] = 0;
                printf ("          w=%lu\n", (unsigned long) w);
                printf ("buffer_size=%lu\n", (unsigned long) buffer_size);
                printf ("     buffer=\n'%s'\n", buffer);
    #endif
                if (tmp != NULL)
                {
                   buffer = tmp;
                   buffer_size += BUFFER_SIZE;
                   w += BUFFER_SIZE;
                   w--;
                }
                else
                {
                   free(buffer), buffer = NULL;
                   printf("memory error\n");
                   break;
                }
             }
             if (buffer != NULL)
             {
                buffer[w + nb_read] = 0;
                printf ("%s", buffer);
                fflush (stdout);
             }
             free(buffer), buffer = NULL;
          }
          fclose(fp), fp = NULL;
       }
       else
       {
          perror(filename);
       }
       return 0;
    }
    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
     
              w=0
    buffer_size=128
         buffer=
    'Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce l'
              w=127
    buffer_size=256
         buffer=
    'Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se ra'
              w=254
    buffer_size=384
         buffer=
    'Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se rapporte à votre plumage,
    Vous êtes le Phénix des hôtes de ces bois."
    A ces mots le Corbeau ne se sent pas de joie ;
    Et pour mont'
              w=381
    buffer_size=512
         buffer=
    'Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se rapporte à votre plumage,
    Vous êtes le Phénix des hôtes de ces bois."
    A ces mots le Corbeau ne se sent pas de joie ;
    Et pour montrer sa belle voix,
    Il ouvre un large bec, laisse tomber sa proie.
    Le Renard s'en saisit, et dit : "Mon bon Monsieur,
    Apprenez q'
              w=508
    buffer_size=640
         buffer=
    'Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se rapporte à votre plumage,
    Vous êtes le Phénix des hôtes de ces bois."
    A ces mots le Corbeau ne se sent pas de joie ;
    Et pour montrer sa belle voix,
    Il ouvre un large bec, laisse tomber sa proie.
    Le Renard s'en saisit, et dit : "Mon bon Monsieur,
    Apprenez que tout flatteur
    Vit aux dépens de celui qui l'écoute :
    Cette leçon vaut bien un fromage, sans doute. "
    Le Corbeau, honteux et '
    Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se rapporte à votre plumage,
    Vous êtes le Phénix des hôtes de ces bois."
    A ces mots le Corbeau ne se sent pas de joie ;
    Et pour montrer sa belle voix,
    Il ouvre un large bec, laisse tomber sa proie.
    Le Renard s'en saisit, et dit : "Mon bon Monsieur,
    Apprenez que tout flatteur
    Vit aux dépens de celui qui l'écoute :
    Cette leçon vaut bien un fromage, sans doute. "
    Le Corbeau, honteux et confus,
    Jura, mais un peu tard, qu'on ne l'y prendrait plus.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    ReadFile fait une lecture binaire du fichier.
    Pas plus 'binaire' que le read() de POSIX.1...

    C'est uine fonction système, c'est tout. A part qu'elle n'est pas portable, elle n'a pas beaucoup d'intérêt, sauf péripheriques 'spéciaux' comme COM1, LPT1 etc.

  10. #10
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pas plus 'binaire' que le read() de POSIX.1...

    C'est uine fonction système, c'est tout. A part qu'elle n'est pas portable, elle n'a pas beaucoup d'intérêt, sauf péripheriques 'spéciaux' comme COM1, LPT1 etc.
    J'ai dit "binaire" pour dire qu'il n'y avait aucune interprétation des octets comme dans fread, par opposition au fgets.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Trap D
    J'ai dit "binaire" pour dire qu'il n'y avait aucune interprétation des octets comme dans fread, par opposition au fgets.
    C'est une légende urbaine bien connue. L'interprétation vient du mode d'ouverture et non de la fonction de lecture. J'ai montré au-dessus que j'avais parfaitement lu et restitué un fichier texte avec fread() (Sous Windows)

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

Discussions similaires

  1. Probleme CreateFile, ReadFile et WriteFile Windows98
    Par Albenejean dans le forum Windows
    Réponses: 6
    Dernier message: 27/10/2005, 18h47
  2. Pb fprintf, fscanf pour un fichier .txt
    Par GeekMéPaTrop dans le forum C
    Réponses: 8
    Dernier message: 23/09/2005, 18h57
  3. API ReadFile et WriteFile, comment l'utiliser ?
    Par AsmCode dans le forum MFC
    Réponses: 2
    Dernier message: 04/08/2005, 22h25
  4. [C#] recherche equivalent du readfile() de PHP
    Par MaxiMax dans le forum ASP.NET
    Réponses: 5
    Dernier message: 01/07/2005, 16h41
  5. [MFC] fonction ReadFile qui bloque
    Par r0d dans le forum MFC
    Réponses: 9
    Dernier message: 15/04/2005, 13h21

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