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 :

fwrite avec path


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut fwrite avec path
    Bonjour,

    je souhaite simplement écrire un chemin de fichier dans un autre fichier de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if(fwrite("C:\\dossier\\fichier.txt", sizeof("C:\\dossier\\fichier.txt"),
                1, fin)!=1)
            {
               printf("fwrite FAILED");
            }
    mais je n'obtiens que C: dans le fichier
    et si je mets 2 au lieu de 1 dans fwrite j'obitens un peu plus mais pas assez...
    comment savoir combien je dois mettre exactement dans le 3e paramètres ?

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par frizou11
    Bonjour,

    je souhaite simplement écrire un chemin de fichier dans un autre fichier de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if(fwrite("C:\\dossier\\fichier.txt", sizeof("C:\\dossier\\fichier.txt"),
                1, fin)!=1)
            {
               printf("fwrite FAILED");
            }
    mais je n'obtiens que C: dans le fichier
    et si je mets 2 au lieu de 1 dans fwrite j'obitens un peu plus mais pas assez...
    comment savoir combien je dois mettre exactement dans le 3e paramètres ?
    Normal, tu utilises fwrite() à l'envers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
    char const * str = "C:\\dossier\\fichier.txt";
    size_t lng = strlen(str);
    ...
    if (fwrite(str, 1, lng, fin) != lng) {
       printf("fwrite FAILED");
    }
     
    ...
    A+

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut
    euh, t'es sûr de toi là ? car j'obtiens toujours la même chose : C:
    d'après la MSDN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    size_t fwrite(
       const void *buffer,
       size_t size,
       size_t count,
       FILE *stream 
    );
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    size
    Item size in bytes.
    count
    Maximum number of items to be written.

  4. #4
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    c'est pas la structure, qu'il faut regarder, mais la fonction...

    http://www.linux-france.org/article/...3/fread-3.html
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut
    oui donc je veux bien 1 entité à écrire (mon chemin tout entier) de longueur sizeof(monchemin).
    où est donc mon problème ?
    est ce que la longueur bloque sur le "\" ?

  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 frizou11
    je souhaite simplement écrire un chemin de fichier dans un autre fichier de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if(fwrite("C:\\dossier\\fichier.txt", sizeof("C:\\dossier\\fichier.txt"),
                1, fin)!=1)
            {
               printf("fwrite FAILED");
            }
    mais je n'obtiens que C: dans le fichier
    et si je mets 2 au lieu de 1 dans fwrite j'obitens un peu plus mais pas assez...
    comment savoir combien je dois mettre exactement dans le 3e paramètres ?
    Bizarre, ton code devrait fonctionner (ou alors ce que tu nous montres n'est pas le code réel, et tu passes par des pointeurs). Mais il est horriblement mal écrit. Ne pas utiliser sizeof, mais strlen().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            char path[] = "C:\\dossier\\fichier.txt";
            if (fwrite (path, strlen (path), 1, fin) != 1)
            {
               printf("fwrite FAILED\n");
            }
    Demo :
    Ceci :
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       FILE *fin = stdout;
     
       {
          if (fwrite
              ("C:\\dossier\\fichier.txt", sizeof ("C:\\dossier\\fichier.txt"), 1,
               fin) != 1)
          {
             printf ("fwrite FAILED");
          }
       }
     
       {
          char path[] = "C:\\dossier\\fichier.txt";
          if (fwrite (path, sizeof path, 1, fin) != 1)
          {
             printf ("fwrite FAILED\n");
          }
       }
       return 0;
    }
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    C:\dossier\fichier.txt C:\dossier\fichier.txt
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            if(fwrite("C:\\dossier\\fichier.txt", sizeof("C:\\dossier\\fichier.txt"),
                1, fin)!=1)
            {
               printf("fwrite FAILED");
            }
    Ton code doit marcher, bien que cette utilisation de sizeof ne soit pas la méthode la plus courante.
    Toutefois, tu ne peux pas écrire qq chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char * str = "C:\\dossier\\fichier.txt";         
    if(fwrite(str, sizeof str, 1, fin)!=1)
    et là, tu dois passer par strlen(str)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par frizou11
    oui donc je veux bien 1 entité à écrire (mon chemin tout entier) de longueur sizeof(monchemin).
    où est donc mon problème ?
    est ce que la longueur bloque sur le "\" ?
    Non, le sizeof doit bien renvoyer la longueur de la chaine littérale correctement. Il n'y a priori pas de pb mis à part que la logique me parait quelque peu étriquée. Je préfère, c'est très subjectif, considérer une chaine de caractères comme N caractères occupant chacun 1 byte plutôt que de prendre la chaine comme un gros paquet unique. Le pb est peut être ailleurs.

    Ce petit exemple marche bien :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    int main(void) {
     
        char const * str = "C:\\dossier\\fichier.txt";
        size_t lng = strlen(str);
        FILE * f = fopen("chemin.txt", "wb");
     
        if (!f) {
            fprintf(stderr, "fopen ne peut ouvrir chemin.txt en ecriture\n");
            exit(EXIT_FAILURE);    
        }
     
        if (fwrite(str, 1, lng, f) != lng) {
            fprintf(stderr, "fwrite s'est vautre lamentablement\n");
        }
     
        fclose(f);
     
        return 0;
     
    }
    A+

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut
    Merci pour vos réponses.
    En fait vos exemples marchent très bien.
    Ne l'ayant pas mentionné aupravant pensant que ça ne changeait pas grand chose, en fait je travaille non pas avec des char * mais avec des wchar_t *.
    Ainsi l'exemple suivant ne fonctionne pas :
    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
     
     #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
    int main(void) {
        wchar_t const * str = L"C:\\dossier\\fichier.txt";
        size_t lng = wcslen(str);
        FILE * f = _wfopen(L"chemin.txt", L"wb");
     
        if (!f) {
            fprintf(stderr, "fopen ne peut ouvrir chemin.txt en ecriture\n");
            exit(EXIT_FAILURE);    
        }
     
        if (fwrite(str, 1, lng, f) != lng) {
            fprintf(stderr, "fwrite s'est vautre lamentablement\n");
        }
     
        fclose(f);
     
        return 0;
     }

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 266
    Points : 161
    Points
    161
    Par défaut
    C'est bon j'ai trouvé
    Lors du calcul de la longueur il faut prendre en compte que je travaille avec des wchar_t * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    size_t lng = wcslen(str)*sizeof(wchar_t);
    Désolé de pas avoir pris en compte le fait que je ne travaillais pas avec des char *, je pensais pas que ça viendrait de là.

    Encore merci pour vos réponses !

  11. #11
    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 frizou11
    Merci pour vos réponses.
    En fait vos exemples marchent très bien.
    Ne l'ayant pas mentionné aupravant pensant que ça ne changeait pas grand chose, en fait je travaille non pas avec des char * mais avec des wchar_t *.
    Ainsi l'exemple suivant ne fonctionne pas :
    Il ne faut pas se tromper dans les tailles :
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <wchar.h>
     
    int main (void)
    {
       int ret = EXIT_SUCCESS;
       wchar_t const *str = L"C:\\dossier\\fichier.txt";
       size_t lng = wcslen (str);
     
       /* / !\ NON STANDARD / !\ */
       FILE *f = _wfopen (L"chemin.txt", L"wb"); 
     
       if (f != NULL)
       {
          if (fwrite (str, sizeof *str, lng, f) != lng)
          {
             fprintf (stderr, "fwrite s'est vautre lamentablement\n");
          }
     
          fclose (f);
          system ("/util/xdump.exe chemin.txt");
       }
       else
       {
          perror ("chemin.txt");
          ret = EXIT_FAILURE;
       }
       return ret;
    }
    produit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    processing 'chemin.txt'
    43 00 3A 00 5C 00 64 00 6F 00 73 00 73 00 69 00    C.:.\.d.o.s.s.i.
    65 00 72 00 5C 00 66 00 69 00 63 00 68 00 69 00    e.r.\.f.i.c.h.i.
    65 00 72 00 2E 00 74 00 78 00 74 00                e.r...t.x.t.
     
    Press ENTER to continue.
    avec xdump.exe :
    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
     
    /* main.c */
    #include <ctype.h>
    #include <stdio.h>
     
    static void usage (void)
    {
       puts ("usage xdump file");
    }
     
    static int xdump (char const *s_file)
    {
       int err = 0;
       printf ("processing '%s'\n", s_file);
       {
          FILE *fp = fopen (s_file, "rb");
     
          if (fp != NULL)
          {
             int c;
             unsigned char line[16];
             int i = 0;
             while ((c = fgetc (fp)) != EOF)
             {
                printf ("%02X ", (unsigned) (unsigned char) c);
                line[i] = c;
                i++;
                if (i == 16)
                {
                   int j;
                   printf ("   ");
                   for (j = 0; j < i; j++)
                   {
                      c = line[j];
                      if (isprint (c))
                      {
                         printf ("%c", c);
                      }
                      else
                      {
                         printf (".");
                      }
                   }
                   printf ("\n");
                   i = 0;
                }
             }
             if (i != 0)
             {
                int j;
                for (j = 0; j < 16 - i; j++)
                {
                   printf ("   ");
                }
                printf ("   ");
                for (j = 0; j < i; j++)
                {
                   c = line[j];
                   if (isprint (c))
                   {
                      printf ("%c", c);
                   }
                   else
                   {
                      printf (".");
                   }
                }
                printf ("\n");
                i = 0;
             }
             fclose (fp), fp = NULL;
          }
          else
          {
             perror (s_file);
          }
       }
       return err;
    }
     
    int main (int argc, char **argv)
    {
       if (argc > 1)
       {
          xdump (argv[1]);
       }
       else
       {
          usage ();
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Utiliser la fonction fwrite avec un encodage UTF-8
    Par Mo_Poly dans le forum Langage
    Réponses: 4
    Dernier message: 30/01/2008, 22h19
  2. Probleme avec path
    Par bubu92 dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 02/08/2007, 20h33
  3. Réponses: 1
    Dernier message: 19/05/2006, 11h45
  4. [JAXB/DOM] Parser Xml : possible avec path reel et non uri !
    Par Jaxofun dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 01/08/2005, 10h04
  5. [Borland CPP Compiler] Probleme avec !! Path !!
    Par kanzarih dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 20/10/2004, 23h07

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