Используя Структуру 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 и, что более важно, обработка ошибок объясняются хорошо в приведенной ниже ссылке

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