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

  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 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.

  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 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.

  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)

  12. #12
    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
    Je ne fais jamais de fread avec un fichier ouvert en mode texte.
    La manière dont utilises ici fread est tout à fait correcte, mais tu pouvais aussi bien le faire avec fgets, tu ne fais aucun traitement avec les données saisies, si par exemple tu devais compléter toutes les lignes à 50 caractères, utiliserais tu fread ?
    Tu sais aussi bien, si ce n'est bien mieux, que moi que fread est conçu pour lire des bytes dans un fichier ouvert en mode binaire.
    "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

  13. #13
    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
    Je ne fais jamais de fread avec un fichier ouvert en mode texte.
    La manière dont utilises ici fread est tout à fait correcte, mais tu pouvais aussi bien le faire avec fgets, tu ne fais aucun traitement avec les données saisies, si par exemple tu devais compléter toutes les lignes à 50 caractères, utiliserais tu fread ?
    Tu sais aussi bien, si ce n'est bien mieux, que moi que fread est conçu pour lire des bytes dans un fichier ouvert en mode binaire.
    Mon but était surtout de montrer que d'utiliser ReadFike() était inutile dans le contexte (qui se trouve être un fichier texte) et qu'on pouvait très bien utiliser fread() à la place. Je ne dis pas que c'est le meilleur choix, mais ça marche et l'interprétation CRLF -> LF est bien faite.

    Dire "fread() n'interpréte pas" est une erreur. Encore une fois, ça dépend du mode d'ouverture et non de la fonction.

    D'ailleurs c'est évident si on utilise fgetc() sous Windows. Pour lire un '\n', La même fonction sera appelée une fois en mode "r" et 2 fois en mode "rb"...

  14. #14
    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 Trap D
    Tu sais aussi bien, si ce n'est bien mieux, que moi que fread est conçu pour lire des bytes dans un fichier ouvert en mode binaire.
    fgetc est concu pour une lecture par caractere
    fgets est concu pour une lecture par ligne delimitee par des \n
    fread est concu pour une lecture par bloc

    dans chaque cas, pour des fichiers binaires ou textes.

    Il est vrai qu'influence par des desirs de performances et la meconnaissance d'autres systemes que Windows, Unix, MacOs, la plupart des gens, si ils sont dans un contexte ou la lecture par bloc d'un fichier texte est ce qui leur faut, vont mettre le fichier en binaire et interpreter \n \r\n \r (et \n\r pour les amateurs de symetrie) comme fin de ligne s'ils ont besoin d'avoir par la suite une notion de fin de ligne. Mais le code est moins portable qu'avoir place le fichier en mode texte et avoir utilise fread (il y a des systemes -- VMS, TOPS-20 pour en donner deux que j'ai utilises -- ayant une notion de fichier texte differente pour l'OS des fichiers binaires, il ne me semble donc pas absurde -- cela fait longtemps et je n'ai pas beaucoup travaille en C dessus et ne sais pas/plus ce que fait le runtime C dans ces cas -- que l'open echoue dans ces systemes quand on ne passe pas le mode correspondant au type systeme du fichier).

  15. #15
    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
    Corrigez moi si je me trompes, mais ReadFile permet le partage d'un fichier ou non à certain niveau, via Windows. (Entre applications).

    Mon code est une appli console pour que ce soit plus simple à utiliser/compiler, mais c'est pour mettre dans un programme AppWindows, d'où l'utilité.

    Dans le tuto Développez.Com
    L'API Windows fournit la fonction CreateFile() pour ouvrir ou créer des fichiers. Cette fonction permet de gérer le partage du fichier au niveau système, les attributs de ce fichiers. Il est important de bien comprendre les paramètres principaux de cette fonction.
    Je me trompes sur l'usage que je fais de ReadFile ?

  16. #16
    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
    Corrigez moi si je me trompes, mais ReadFile permet le partage d'un fichier ou non à certain niveau, via Windows. (Entre applications).
    Effectivement, si tu as besoin de gérér les droits du fichier, il faut CreateFile() etc. Tu as vraiment besoin de ça ?

  17. #17
    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
    C'est dans le CreateFile que tu autorises le partage de ton fichier avec les autres applis.
    Citation Envoyé par MSDN
    dwShareMode [in] Specifies how the object can be shared. If dwShareMode is 0, the object cannot be shared. Subsequent open operations on the object will fail, until the handle is closed. To share the object, use a combination of one or more of the following values:
    Value Description FILE_SHARE_READ Subsequent open operations on the object will succeed only if read access is requested. FILE_SHARE_WRITE Subsequent open operations on the object will succeed only if write access is requested.
    Emmanuel >> OpenFile est fourni pour la compatibilité Windows 16 Bits, maintenant c'est CreateFile(Ex)
    "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

  18. #18
    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
    Effectivement, si tu as besoin de gérér les droits du fichier, il faut CreateFile() etc. Tu as vraiment besoin de ça ?
    Oui

+ 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