Использование Struct Stat () - PullRequest
       5

Использование Struct Stat ()

9 голосов
/ 18 августа 2010

Я пытаюсь выяснить, как именно использовать 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 является параметром для статистики?Меня не волнует хранение этой информации в памяти, мне просто нужны выходные поля в моей программе на С ++.Как мне получить доступ к информации, содержащейся в структуре?Действительно ли buf должен содержать возвращенную информацию из stat ()?

Ответы [ 5 ]

12 голосов
/ 18 августа 2010

Да, buf используется здесь как выходной параметр. Результаты сохраняются в buf, а возвращаемое значение stat является кодом ошибки, указывающим, была ли операция stat успешной или неудачной.

Это сделано так, потому что stat - это функция POSIX, разработанная для C, которая не поддерживает механизмы сообщения об ошибках вне диапазона, такие как исключения. Если бы stat вернул структуру, он не мог бы указывать на ошибки. Использование этого метода out-параметра также позволяет вызывающему абоненту выбирать, где он хочет сохранить результаты, но это вторичная функция. Вполне нормально передать адрес обычной локальной переменной, как вы это сделали здесь.

Вы получаете доступ к полям структуры, как и любой другой объект. Я полагаю, вы хотя бы знакомы с обозначениями объектов? Например. поле st_dev в структуре stat с именем buf доступно buf.st_dev. Итак:

cout << buf.st_dev << endl;

и т.д.

4 голосов
/ 13 сентября 2011

Для другого проекта я выбрал небольшую функцию, которая делает что-то похожее на то, что вам нужно. Взгляните на 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 */
2 голосов
/ 15 июля 2014

Этот вопрос может быть старым, чтобы комментировать, но я публикую это как ссылку

Чтобы лучше понять функцию stat (), причину передачи ссылки на статистику и, что более важно, обработку ошибок хорошо объясните в приведенной ниже ссылке

stat - получить статус файла

2 голосов
/ 18 августа 2010

В вашем коде несколько ошибок:

  • Вам нужно &buf, с одним 'f'.
  • Вы должны сказать, например, buf.st_dev при печати, поскольку st_dev является полем в переменной struct.

Поскольку buf - локальная переменная в стеке, вы не «постоянно сохраняете значения в памяти», это только до тех пор, пока эта переменная находится в области видимости.

Так вы возвращаете несколько значений, как правило, в C и C ++. Вы передаете указатель на структуру, и вызываемая функция заполняет структуру значениями, которые она вычислила для вас.

1 голос
/ 18 августа 2010

buf - это структура, которая загружается с информацией о файле, который вы передаете в первом параметре. Вы передаете &buf здесь b / c, у вас есть buf, выделенный в стеке как локальная переменная, и вы должны передать указатель на функцию stat, чтобы он мог загружать данные.

Все переменные st_* являются частью объекта struct stat и поэтому должны быть доступны через локальную переменную buf как buf.st_uid и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...