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

Я ' Я пытаюсь понять, как именно использовать 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 ()?

10
задан Tyler McHenry 18 August 2010 в 13:27
поделиться

3 ответа

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

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

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

cout << buf.st_dev << endl;

и т. Д.

12
ответ дан 3 December 2019 в 19:31
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 19:31
поделиться

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

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

1
ответ дан 3 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: