J'essaie de comprendre comment utiliser exactement Stat () pour capturer des informations sur un fichier. Ce dont j'ai besoin, c'est d'être capable d'imprimer plusieurs domaines d'informations sur un fichier. Alors ..
#include <iostream> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> using namespace std; int main() { struct stat buf; stat("file",&buf); ... cout << st_dev << endl; cout << st_ino << endl; cout << st_mode << endl; cout << st_nlink << endl; cout << st_uid << endl; cout << st_gid << endl; cout << st_rdev << endl; cout << st_size << endl; cout << st_blksize << endl; cout << st_blocks << endl; cout << st_atime << endl; cout << st_mtime << endl; cout << st_ctime << endl; ... }
6 Réponses :
Vous avez plusieurs erreurs dans votre code: p>
& buf code>, avec un seul 'F'. Li>
- Vous devez dire par exemple.
buf.st_dev code> Lors de l'impression, car st_dev code> est un champ de la variable de struct. li>
ul>
Etant donné que buf code> est une variable locale sur la pile, vous ne "enregistrer pas les valeurs à la mémoire" de manière permanente, c'est aussi longtemps que cette variable est en mesure de la portée. P>
Voici comment vous retournez plusieurs valeurs, généralement, en C et C ++. Vous passez un pointeur sur une structure et la fonction appelée remplit dans la structure avec les valeurs qu'il a calculées pour vous. P>
Oui, Il est fait de cette façon parce que Vous accédez aux champs d'une structure comme vous le feriez tout autre objet. Je présume que vous êtes au moins familier avec la notation d'objet? Par exemple. Le champ etc. P> p> buf code> est utilisé ici sous forme de paramètre Out-Paramètre. Les résultats sont stockés dans
buf code> et la valeur de retour de
STAT code> est un code d'erreur indiquant si l'opération code> Stat code> a réussi ou échoué.
STAT code> est une fonction POSIX, conçue pour C, qui ne prend pas en charge les mécanismes de rapport d'erreur hors bande tels que des exceptions. Si
STAT code> retourné em> une structure, il n'aurait aucun moyen d'indiquer des erreurs. L'utilisation de cette méthode Out-Parameter permet également à l'appelant de choisir où elles souhaitent stocker les résultats, mais c'est une fonctionnalité secondaire. Il convient parfaitement à passer l'adresse d'une variable locale normale, tout comme vous l'avez fait ici. P>
st_dev code> dans le
STAT CODE> STRIT appelé
BUF code> est accessible par
buf.st_dev code>. Donc: p>
Toutes les variables de buf code> est la structure que STAT chargee avec les informations sur le fichier que vous passez dans le premier paramètre. Vous passez
& buf code> ici b / c Vous avez
buf code> alloué sur la pile sous forme de variable locale et vous devez transmettre un pointeur sur la fonction STAT pour lui permettre de charger les données. p>
st _ * code> font partie de l'objet STR STAT. Il faut donc accéder via votre variable locale
buf code> comme
buf.st_uid code> , etc. p>
Pour un autre projet, j'ai fouillé une petite fonction qui fait quelque chose de similiaire à ce dont vous avez besoin. Jetez un coup d'œil à sprintstatf .
Voici un exemple d'utilisation: P>
#include <sys/stat.h> #include <stdlib.h> #include <stdio.h> #include "sprintstatf.h" int main(int argc, char *argv[]) { char *outbuf = (char *)malloc(2048 * sizeof(char)); struct stat stbuf; char *fmt = \ "st_atime (decimal) = \"%a\"\n" "st_atime (string) = \"%A\"\n" "st_ctime (decimal) = \"%c\"\n" "st_ctime (string) = \"%C\"\n" "st_gid (decimal) = \"%g\"\n" "st_gid (string) = \"%G\"\n" "st_ino = \"%i\"\n" "st_mtime (decimal) = \"%m\"\n" "st_mtime (string) = \"%M\"\n" "st_nlink = \"%n\"\n" "st_mode (octal) = \"%p\"\n" "st_mode (string) = \"%P\"\n" "st_size = \"%s\"\n" "st_uid = \"%u\"\n" "st_uid = \"%U\"\n"; lstat(argv[1], &stbuf); sprintstatf(outbuf, fmt, &stbuf); printf("%s", outbuf); free(outbuf); exit(EXIT_SUCCESS); } /* EOF */
Cette question peut être une voie trop vieille à commenter, mais je pose cela comme une référence p>
Pour obtenir une bonne compréhension de la fonction Stat (), la raison de la transmission de la référence Stat et de la gestion des erreurs plus importante est-elle bien expliquée dans le lien ci-dessous p>
Une chose similaire est avec la bibliothèque CTonne. Est conçu de la même manière. D'abord consiste à créer une structure vide. Vous avez accès à l'objet de la structure, mais tous les champs sont vides. Ensuite, vous utilisez cette fonction (& Nom-of-Create-OBIect) et est une ADRES au point d'obiect à l'extérieur de cette fonction. La fonction est conçue pour stocker toutes les informations à cette structure obiece à partir de référence donnée et Kaboom, vous avez obiect avec des données prêtes à utiliser. P>
Sinon, si vous ne voulez pas d'utiliser un pointeur, vous devez utiliser Obiect = fonction (null); p>
avec pointeur Fonction (& obiect); p>
Je vois, merci de tous pour les réponses. Ils étaient assez utiles. Est-ce que quelqu'un sait comment utiliser STDIN, STDOUT ou STDRERR comme paramètres à STAT fonctionne? Ce sont des flux et non des fichiers, alors comment les statistionnistes peuvent-elles remplir une structure avec des données?
Utilisez
FSTAT code>, qui prend un descripteur de fichier comme premier argument au lieu d'un chemin.
Normalement, je ferais cela, mais l'environnement est quelque peu artificiel car il s'agit de la partie OS d'un simulateur architectural que j'ai écrit. Donc, lorsqu'un fichier est ouvert par un syscall, j'ai mon propre vecteur pour agir en tant que table descripteur de fichier. Y a-t-il un bon moyen de capturer le descripteur de fichier réel sur la machine pour un fichier tel qu'il est ouvert? Si tel était le cas, j'utiliserais FSTAT car aucune traduction ne serait requise entre les statistiques de flux et les statistiques de fichiers.
Vous devriez poser ces choses comme une question distincte alors plus de personnes peuvent les voir et de manière à ce qu'il y ait plus d'espace pour écrire que dans les commentaires.
Ça ira. Je n'étais pas sûr si c'était une question triviale ou non.