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 :

struct stat et st_size sous unix


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut struct stat et st_size sous unix
    Bonjour

    J'essaie de récupérer la taille d'un fichier à partir de la structure stat sous unix.

    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
     
    #include <stdio.h>
     
    #include <stdlib.h>
     
    #include <sys/stat.h>
     
     
     
    int main(int argc, char *argv[]){
     
    	struct stat *info;
    	FILE fichier;
     
     
     
     
        if (argc == 2){
     
    		if (stat(argv[1], info) == -1)
    			return 100;/*erreur on ne pas récupérer la taille de cette façon*/
    		printf("taille : %d\n", info.st_size);
     
        }
     
        return 0;
     
    }
    à la compilation j'ai le message d'erreur suivant :
    error: request for member ‘st_size’ in something not a structure or union

    Si quelqu'un a une idée de ce que cela signifie ...

    Merci.

  2. #2
    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 Discovery Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	struct stat *info;
    <...<
    		printf("taille : %d\n", info.st_size);
    error: request for member ‘st_size’ in something not a structure or union
    info est un pointeur (je recommande p_info). Il faut donc utiliser -> et non . pour atteindre un champ de la structure.

    Mais comme l'a précisé ram-0000, ton code est faux...

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    comme info est un pointeur, il faut utiliser info-> pour utiliser les membres de la structure.

    Par contre, ton programme est faux.

    la fonction stat() demande l'adresse d'une structure struct stat, pas un pointeur. C'est bien de lire la doc, mais il faut interpréter ensuite.

    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
    int main(int argc, char *argv[]){
     
    	struct stat info;
    	FILE fichier;
    	
     
     
     
        if (argc == 2){
     
    		if (stat(argv[1], &info) == -1)
    			return 100;/*erreur on ne pas récupérer la taille de cette façon*/
    		printf("taille : %d\n", info.st_size);
     
        }
     
        return 0;
     
    }
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    Merci de vos réponses.

    J'ai corrigé le code ainsi :
    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
     
    #include <stdio.h>
     
    #include <stdlib.h>
     
    #include <sys/stat.h>
     
     
     
    int main(int argc, char *argv[]){
     
    	struct stat info;
    	FILE fichier;
     
     
     
     
        if (argc == 2){
     
    		if (stat(argv[1], &info) == -1)
    			return 100;/*erreur on ne pas récupérer la taille de cette façon*/
    		printf("taille : %d\n", (int) info.st_size);
     
        }
     
        return 0;
     
    }
    il marche.

    Mais je ne comprend pas la différence entre un pointeur et une addresse.

  5. #5
    Membre émérite
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Par défaut
    Salut
    Citation Envoyé par Discovery Voir le message
    Mais je ne comprend pas la différence entre un pointeur et une addresse.
    Un pointeur est une variable dont la valeur est une adresse. En general cette adresse est celle d'une autre variable.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Par défaut
    D'accord, mais je ne comprend pas quelle et la différence entre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type *pt;
     
    utilisation de pt;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type objet;
     
    utilisation de &objet;
    je ne sais pas si je suis claire, mais on peut voir comme exemple au-dessus la fonction stat qui prend en argument (struct stat *) info et qui plante, ou la mm fonction qui prend en argument &(struct stat)info et qui marche...

  7. #7
    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
    Citation Envoyé par Discovery Voir le message
    D'accord, mais je ne comprend pas quelle et la différence entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type *pt;
    utilisation de pt;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type objet;
    utilisation de &objet;
    je ne sais pas si je suis claire, mais on peut voir comme exemple au-dessus la fonction stat qui prend en argument (struct stat *) info et qui plante, ou la mm fonction qui prend en argument &(struct stat)info et qui marche...
    - pt est un objet.
    Comme pour tout objet, une zone mémoire lui est allouée pour stocker une valeur. Cette valeur doit être l'adresse d'un objet. Le type 'adresse sur Type' s'écrivant Type *, le type de pt est Type* .
    Si on ne met rien dedans, il contient n'importe quoi.

    - &objet n'est pas un objet.
    Il n'a pas de zone mémoire qui lui est réservée. C'est une valeur qui est l'adresse de 'objet'. Tant que 'objet' existe, cette expression a un sens.
    On ne peut pas écrire &objet =.... (ce qui serait le même type d'erreur que d'écrire 3 =....)

    - Si j'ai besoin de stocker l'adresse de 'objet', il me faut un pointeur (du type Type *) et j'écrirai pt = &objet

    - Là où on attend l'adresse de 'objet', je peux mettre comme argument &objet. je peux mettre pt à condition que pt contienne l'adresse de 'objet' donc par exemple si j'ai fait pt = &objet avant. Un exemple est le passage d'une adresse en argument de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Type objet;
    Type * pt = &objet; 
    fonc(pt); // parce que pt contient l'adresse de objet
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type objet;
    fonc(&objet);
    avec dans les deux cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ....fonc(Type* p) // p doit être un pointeur sur Type pour recevoir la valeur passée en argument
    {
    ....
    }

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

Discussions similaires

  1. [Process] pb exec sous unix, ne plante pas mais ne fait rien
    Par NiBicUs dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 10/12/2004, 05h27
  2. [Kylix] Kylix sous UNIX
    Par gRRosminet dans le forum EDI
    Réponses: 3
    Dernier message: 09/11/2004, 17h07
  3. Montage sur Debian de AFPS sous UNIX
    Par Harbaingan dans le forum Administration système
    Réponses: 2
    Dernier message: 14/01/2004, 22h03
  4. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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