I'm trying to figure out how exactly to use stat() to capture information about a file. What I need is to be able to print several fields of information about a file. So..
#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;
...
}
I'm thoroughly confused about how to do this. Why is &buf a parameter to stat? I don't care about storing this information in memory, I just need the outputted fields within my c++ program. How do I access the information contained in the struct? Is buf actually supposed to contain the returned information from stat()?
Yes,
buf
is being used here as an out-parameter. The results are stored inbuf
and the return value ofstat
is an error code indicating if thestat
operation succeeded or failed.It is done this way because
stat
is a POSIX function, designed for C, which does not support out-of-band error reporting mechanisms like exceptions. Ifstat
returned a struct, then it would have no way to indicate errors. Using this out-parameter method also allows the caller to choose where they want to store the results, but that's a secondary feature. It's perfectly fine to pass the address of a normal local variable, just like you have done here.You access the fields of a struct like you would any other object. I presume you are at least familar with object notation? E.g. the
st_dev
field within thestat
struct calledbuf
is accessed bybuf.st_dev
. So:etc.
buf
is the structure that stat loads with the information about the file you pass in the first parameter. You pass&buf
here b/c you havebuf
allocated on the stack as a local variable and you must pass a pointer to the stat function to enable it to load the data.All variables of
st_*
are part of the struct stat object and thus must be accessed via your localbuf
variable asbuf.st_uid
, etc.This question may be way to old to comment but i am posting this as a reference
To get a good understanding about stat() function ,the reason for passing the stat reference and more importantly error handling are explained good in the below link
stat - get file status
For another project, I've whipped up a little function that does something similiar to what you need. Take a look at sprintstatf.
Here's an example of usage:
You have several errors in your code:
&buf
, with a single 'f'.buf.st_dev
when printing, sincest_dev
is a field in the struct variable.Since
buf
is a local variable on the stack, you're not "saving the values to memory" permanently, it's just as long as that variable is in-scope.This is how you return multiple values, typically, in C and C++. You pass a pointer to a structure, and the function being called fills in the structure with the values it has computed for you.