À L'Aide Struct Stat()
Je suis à essayer de comprendre exactement comment utiliser stat() pour capturer des informations sur un fichier. Ce dont j'ai besoin c'est d'être capable d'imprimer plusieurs champs d'informations sur un fichier. Donc..
#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;
...
}
Je suis complètement confus sur la façon de le faire. Pourquoi est - &buf un paramètre stat? Je ne se soucient pas de stocker ces informations dans la mémoire, j'ai juste besoin de sortir les champs dans mon programme en c++. Comment puis-je accéder à l'information contenue dans la structure? Est buf en fait censé contenir les informations renvoyées de stat()?
Je vois, merci à tous pour les réponses. Ils ont été très utiles. Personne ne sait comment à l'aide de stdin, stdout ou stderr en tant que paramètres de stat œuvres? Ces sont des cours d'eau et non pas des fichiers alors, comment pouvez-stat remplir une structure de données?
Utilisation
Normalement, je devrais le faire, mais l'environnement est quelque peu artificielle, car c'est l'OS de la partie d'une architecture simulateur je l'ai écrit. Alors, quand un fichier est ouvert par un syscall, j'ai mon propre vecteur d'agir comme un descripteur de fichier de la table. Est-il une bonne façon de capturer le réel descripteur de fichier sur la machine pour un fichier tel qu'il est ouvert? Si c'était le cas, je voudrais utiliser fstat, car aucune traduction ne serait nécessaire entre les flux des stats et des statistiques du fichier.
Vous devez demander à ces choses comme une question distincte de sorte que plus de gens peuvent les voir et donc qu'il n'y a plus d'espace pour écrire que dans les commentaires.
Va faire. Je n'étais pas sûr si c'était une question banale ou pas.
Utilisation
fstat
, qui prend un descripteur de fichier en tant que premier argument au lieu d'un chemin.Normalement, je devrais le faire, mais l'environnement est quelque peu artificielle, car c'est l'OS de la partie d'une architecture simulateur je l'ai écrit. Alors, quand un fichier est ouvert par un syscall, j'ai mon propre vecteur d'agir comme un descripteur de fichier de la table. Est-il une bonne façon de capturer le réel descripteur de fichier sur la machine pour un fichier tel qu'il est ouvert? Si c'était le cas, je voudrais utiliser fstat, car aucune traduction ne serait nécessaire entre les flux des stats et des statistiques du fichier.
Vous devez demander à ces choses comme une question distincte de sorte que plus de gens peuvent les voir et donc qu'il n'y a plus d'espace pour écrire que dans les commentaires.
Va faire. Je n'étais pas sûr si c'était une question banale ou pas.
OriginalL'auteur Dan Snyder | 2010-08-18
Vous devez vous connecter pour publier un commentaire.
Oui,
buf
est utilisé ici comme un paramètre de sortie. Les résultats sont stockés dansbuf
et la valeur de retour destat
est un code d'erreur indiquant si lestat
opération a réussi ou échoué.Il est fait de cette façon parce que
stat
est une fonction POSIX, conçu pour le C, qui ne prend pas en charge out-of-band erreur mécanismes d'établissement de rapports comme des exceptions. Sistat
retourné un struct, alors qu'il ne dispose d'aucun moyen pour indiquer des erreurs. À l'aide de ce paramètre méthode permet également à l'appelant de choisir où ils veulent stocker les résultats, mais c'est un élément secondaire. Il est parfaitement bien pour passer l'adresse d'un variable locale, tout comme vous le faites ici.Vous accéder aux champs d'une structure comme vous le feriez pour tout autre objet. Je présume que vous êtes moins familier avec l'objet de la notation? E. g. le
st_dev
à l'intérieur de l'stat
struct appelébuf
est accessible parbuf.st_dev
. Donc:etc.
OriginalL'auteur Tyler McHenry
Pour un autre projet, j'ai préparé une petite fonction qui fait quelque chose de semblable à ce que vous avez besoin. Jetez un oeil à sprintstatf.
Voici un exemple d'utilisation:
OriginalL'auteur Jon Bringhurst
Vous avez plusieurs erreurs dans votre code:
&buf
, avec un seul "f".buf.st_dev
lors de l'impression, depuisst_dev
est un champ dans la structure de la variable.Depuis
buf
est une variable locale sur la pile, vous n'êtes pas "enregistrer les valeurs dans la mémoire" de manière permanente, il est juste aussi longtemps que cette variable est en-portée.C'est une façon de renvoyer 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é pour vous.
OriginalL'auteur unwind
Cette question peut être moyen de le vieux de commenter, mais je suis annonce cela comme une référence
Pour obtenir une bonne compréhension de la stat() de la fonction ,la raison pour le passage de l'état de référence et le plus important de la gestion d'erreur sont bien expliqué dans le lien ci-dessous
stat - obtenir de l'état des fichiers
OriginalL'auteur Ram
buf
est la structure stat que les charges avec les renseignements sur le fichier que vous passer dans le premier paramètre. Vous passez&buf
ici b/c vous avezbuf
alloué sur la pile comme une variable locale, et vous devez passer un pointeur à la fonction stat pour lui permettre de charger les données.Toutes les variables de
st_*
font partie de la struct stat objet et doit donc être accessible via votre localbuf
variable commebuf.st_uid
, etc.OriginalL'auteur RC.