Я ' Я пытаюсь понять, как именно использовать 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 ()?
Да, buf
используется здесь как выходной параметр. Результаты сохраняются в buf
, а возвращаемое значение stat
представляет собой код ошибки, указывающий, была ли операция stat
успешной или неудачной.
Это делается таким образом, потому что stat
- это функция POSIX, разработанная для C, которая не поддерживает механизмы внеполосного сообщения об ошибках, такие как исключения. Если бы stat
вернул структуру, то у нее не было бы возможности указать ошибки. Использование этого метода выходных параметров также позволяет вызывающему абоненту выбирать, где они хотят сохранить результаты, но это второстепенная функция. Совершенно нормально передать адрес обычной локальной переменной, как вы это сделали здесь.
Вы получаете доступ к полям структуры, как и к любому другому объекту. Полагаю, вы хотя бы знакомы с объектной нотацией? Например. поле st_dev
в структуре stat
с именем buf
доступно для buf.st_dev
. Итак:
cout << buf.st_dev << endl;
и т. Д.
В вашем коде есть несколько ошибок:
& buf
с одной буквой 'f'. buf.st_dev
при печати, поскольку st_dev
- это поле в переменной структуры. Поскольку buf
- это локальная переменная в стеке, вы не «сохраняете значения в памяти» навсегда, это просто до тех пор, пока эта переменная находится в области видимости.
Вот как вы возвращаете несколько значений, как правило, в C и C ++. Вы передаете указатель на структуру, и вызываемая функция заполняет структуру значениями, которые она вычислила для вас.
buf
- это структура, которая загружает stat с информацией о файле, который вы передаете в первом параметре. Здесь вы передаете & buf
b / c у вас есть buf
, выделенный в стеке в качестве локальной переменной, и вы должны передать указатель на функцию stat, чтобы она могла загружать данные.
Все переменные st _ *
являются частью объекта struct stat и, следовательно, должны быть доступны через вашу локальную переменную buf
как buf.st_uid
и т. Д.