Используя Структуру Struct Стат()
Я пытаюсь выяснить, как именно использовать stat () для захвата информации о файле. Мне нужно иметь возможность печатать несколько полей информации о файле. Так..
#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;
...
}
Я совершенно запутался в том, как это сделать. Почему &buf является параметром для stat? Мне не нужно хранить эту информацию в памяти, мне просто нужны выведенные поля в моей программе на c++. Как получить доступ к информации, содержащейся в структуре? Действительно ли buf должен содержать возвращенную информацию из stat ()?
5 ответов
да buf
используется здесь в качестве параметра. Результаты хранятся в buf
и возвращаемое значение stat
- это код ошибки, указывающий, если stat
операция выполнена успешно или неудачно.
это делается таким образом, потому что stat
- это функция POSIX, предназначенная для C, которая не поддерживает внеполосные механизмы отчетности об ошибках, такие как исключения. Если stat
вернулся структура, тогда у нее не было бы способа указать ошибки. С помощью этого метод out-parameter также позволяет вызывающему объекту выбирать, где они хотят хранить результаты, но это вторичная функция. Совершенно нормально передать адрес обычной локальной переменной, как вы это сделали здесь.
вы получаете доступ к полям структуры, как и к любому другому объекту. Полагаю, вы хотя бы знакомы с обозначениями объектов? Е. Г. элемент st_dev
поле в stat
структура под названием buf
используется buf.st_dev
. Итак:
cout << buf.st_dev << endl;
etc.
для другого проекта я создал небольшую функцию, которая делает что-то похожее на то, что вам нужно. Взгляните на sprintstatf.
пример использования:
#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 */
у вас есть несколько ошибок в коде:
- вам нужно
&buf
, с одной "f". - нужно сказать, например,
buf.st_dev
при печати, так какst_dev
- это поле в переменной struct.
С buf
является локальной переменной в стеке, вы не" сохраняете значения в памяти " постоянно,это так же, как эта переменная находится в области.
вот как вы возвращаете несколько значений, как правило, в C и c++. Вы проходите указатель на структуру, и вызываемая функция заполняет структуру значениями, вычисленными для вас.
buf
- Это структура, которая загружает stat с информацией о файле, который вы передаете в первом параметре. Вы проходите &buf
здесь b / c у вас есть buf
выделено в стеке как локальная переменная, и вы должны передать указатель на функцию stat, чтобы она могла загружать данные.
все переменные st_*
являются частью объекта struct stat и, следовательно, должны быть доступны через ваш локальный buf
переменная as buf.st_uid
, etc.
этот вопрос может быть способом старого комментария, но я публикую это как ссылку
чтобы получить хорошее представление о функции stat (), причина передачи ссылки на stat и, что более важно, обработка ошибок объясняются хорошо в приведенной ниже ссылке