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 :

Problème avec appels systèmes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut Problème avec appels systèmes
    Bonjour,

    Voila j'ai un petit soucis avec mon code qui doit lire le contenu d'un fichier l'afficher sur la sortie standard mais seulement je ne dois utiliser que des appels systèmes. Mon code est le suivant:

    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
    #include<stdio.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<sys/stat.h>
     
    int main (void)
    {
        int tab[256] = {0}, fd = open ("toto.txt", O_RDONLY);
        char *c;
        ssize_t taille = 0;
        struct stat s;
     
        if (fd == -1)
        {
            printf ("Erreur lors de l'ouverture du fichier\n");
            exit (1);
        }
        fstat (fd, &s);
        c = malloc (s.st_size * sizeof (char));
        taille = read (fd, &c, s.st_size);
        if (taille == -1)
        {
            printf ("Erreur lors de la lecture du fichier\n");
            exit (1);
        }
        printf ("%s\n", c-1);
        close (fd);
     
        return 0;
    }
    Voila alors mon problème est que lorsque j'utilise "fstat ()" pour connaitre la taille de mon fichier et bien je n'ai plus rien du tout qui s'affiche, alors que si je l'enlève et que je remplace "s.st_size" par son contenu en dure et bien ça marche et je n'ai aucune idée du pourquoi... Si quelqu'un pouvais bien m'éclairer Merci d'avance

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Plusieurs remarques :



  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Fait mais cela ne change rien il n'y a toujours rien qui s'affiche

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    montre ta version du code maintenant, stp..

    Aussi, pourquoi utiliser open et non fopen ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 327
    Par défaut
    Voici:

    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
    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <sys/stat.h>
     
    int main (void)
    {
        int tab[256] = {0}, fd = open ("toto.txt", O_RDONLY);
        char *c;
        ssize_t taille = 0;
        struct stat s;
     
        if (fd == -1)
        {
            printf ("Erreur lors de l'ouverture du fichier\n");
            exit (1);
        }
        fstat (fd, &s);
        c = malloc (s.st_size+1 * sizeof (char));
        if (c != NULL)
        {
             taille = read (fd, &c, s.st_size);
             if (taille == -1)
             {
                 printf ("Erreur lors de la lecture du fichier\n");
                 exit (1);
             }
             c[s.st_size] = '\0';
             printf ("%s\n", c);
             close (fd);
        }
        else
        {
             printf ("Erreur lors de l'allocation");
             exit (1);
        }
        return 0;
    }
    Ensuite je n'utilise pas fopen car j'ai envie de faire un code qui n'utilise que des appels systèmes tout simplement pour pouvoir m'y habitué et les comprendre

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        c = malloc (s.st_size+1 * sizeof (char));
    Tu devrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        c = malloc ((s.st_size+1) * sizeof (char));
    Toutefois tu t'en tire bien parce que sizeof(char) vaut toujours 1 et que ces expressions équivalent à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        c = malloc (s.st_size+1);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     taille = read (fd, &c, s.st_size);
    Pourquoi &c ?

    Ensuite je n'utilise pas fopen car j'ai envie de faire un code qui n'utilise que des appels systèmes tout simplement pour pouvoir m'y habitué et les comprendre
    En quoi open() est-il plus "appels systèmes" que fopen() ?

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Tu modifies le pointeur c lors de la lecture.

    Ce n'est pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille = read (fd, &c, s.st_size);
    mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    taille = read (fd, c, s.st_size);
    qu'il faut utiliser.

    Au passage pourquoi ne pas utiliser les fonctions standard fopen(), fread(), etc. ?

  8. #8
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par gl Voir le message
    Au passage pourquoi ne pas utiliser les fonctions standard fopen(), fread(), etc. ?
    on s'est croisé

    Pour le reste effectivement j'avais pas vu

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

Discussions similaires

  1. [AC-2007] Problème avec heure système
    Par marcGR dans le forum IHM
    Réponses: 2
    Dernier message: 27/07/2011, 15h12
  2. Problème avec appel de fonction!
    Par Olivier_Magny dans le forum Débuter
    Réponses: 1
    Dernier message: 10/10/2010, 23h54
  3. [Snow Leopard] Problème avec "Préférences système"
    Par tantris1 dans le forum Apple
    Réponses: 1
    Dernier message: 02/11/2009, 00h11
  4. Problème avec appel de Sub
    Par tribaleur dans le forum VBA Access
    Réponses: 3
    Dernier message: 12/10/2007, 15h39
  5. Réponses: 6
    Dernier message: 27/04/2007, 20h10

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