我正在试图弄清楚如何使用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;
...
}
我对如何做到这一点感到非常困惑。为什么&amp; buf是stat的参数?我不关心将这些信息存储在内存中,我只需要在我的c ++程序中输出字段。如何访问结构中包含的信息? buf实际上是否应该包含stat()的返回信息?
答案 0 :(得分:12)
是的,这里使用buf
作为外部参数。结果存储在buf
中,stat
的返回值是一个错误代码,指示stat
操作是成功还是失败。
这样做是因为stat
是为C设计的POSIX函数,它不支持异常等带外错误报告机制。如果stat
返回结构,则无法指示错误。使用此out-parameter方法还允许调用者选择他们想要存储结果的位置,但这是次要功能。传递正常局部变量的地址是完全没问题的,就像你在这里做的那样。
您可以像访问任何其他对象一样访问结构的字段。我认为你至少熟悉对象符号?例如。名为st_dev
的{{1}}结构中的stat
字段由buf
访问。所以:
buf.st_dev
等
答案 1 :(得分:4)
对于另一个项目,我已经发布了一个功能类似于你需要的功能。看看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 :(得分:2)
您的代码中有几处错误:
&buf
,只需一个'f'。buf.st_dev
,因为st_dev
是struct变量中的一个字段。由于buf
是堆栈上的局部变量,因此您不会永久地“将值保存到内存中”,只要该变量在范围内即可。
这是通常在C和C ++中返回多个值的方法。您将指针传递给结构,并且被调用的函数使用为您计算的值填充结构。
答案 3 :(得分:2)
答案 4 :(得分:1)
buf
是stat加载的结构,其中包含有关您在第一个参数中传递的文件的信息。你将&buf
b / c传递给堆栈上的buf
作为局部变量,你必须传递一个指向stat函数的指针,使其能够加载数据。
st_*
的所有变量都是struct stat对象的一部分,因此必须通过本地buf
变量buf.st_uid
等来访问。
答案 5 :(得分:0)
ctime库与此类似。设计方式相似。 首先是创建空结构。 您可以访问该结构的对象,但是所有字段均为空。 然后,您使用该函数(&name-of-created-obiect),并且是指向该函数外部的对象的adrres。 函数旨在将给定引用中的所有信息存储到该结构对象中,而kaboom,则具有可使用的现成数据。
否则,如果您不想使用指针,则必须使用 Obiect = function(null);
带指针 函数(&obiect);