使用Struct Stat()

时间:2010-08-18 13:14:23

标签: c++ struct posix

我正在试图弄清楚如何使用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()的返回信息?

6 个答案:

答案 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)

这个问题可能是旧的评论,但我发布此作为参考

为了更好地理解stat()函数,传递stat引用的原因以及更重要的错误处理在下面的链接中有解释

stat - get file status

答案 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);