问题出在:返回局部变量的引用,该局部变量的内存会在函数执行结束后,自动回收。该变量的内容也许会立即覆盖,也许会过段时间覆盖。
解决该问题最好的方案应该是让函数的调用者提供内存空间保存函数的返回值。
修改后的代码如下:
头文件:
#include <sys/stat.h>
int stat(const char *restrict pathname, struct stat *restrict buf);
提供文件名字,获取文件对应属性。
int fstat(int filedes, struct stat *buf);
通过文件描述符获取文件对应的属性。
int lstat(const char *restrict pathname, struct stat *restrict buf);
连接文件描述命,获取文件属性。
2 文件对应的属性
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //伟建内容对应的块数量
};
可以通过上面提供的函数,返回一个结构体,保存着文件的信息。
头文件
#inlcude<time.h>
size_t strftime( char *str, size_t maxsize, const char *fmt, struct tm *time );
按照fmt提供的格式要求,格式化输出事件和日期(time)到字符串str中。
fmt的主要格式由以下几种,格式可以同时使用:
字符 | 含义 |
---|---|
%a | 缩略星期名表示(例如: Fri) |
%A | 星期名全称表示(例如: Friday) |
%b | 缩略月份表示 (例如: Oct) |
%B | 月份全程表示:(例如:October) |
%c | 标准的日期和事件字符串表示 |
%d | 用数字表示几月几号(1-31) |
%H | 小时:24小时表示(0-23) |
%I | 小时:12小时表示(1-12) |
%j | 用数字表示一年的第几天(1-366) |
%m | 月份表示(例如:1-12). 在VC++下可能是(0-11). |
%M | 用数字表示分钟(0-59) |
%p | locale's equivalent of AM or PM |
%S | 用数字表示秒钟 (0-59) |
%U | 一年的第几周 (0-53),where week 1 has the first Sunday |
%w | 用数字表示星期几 (0-6),星期天为: 0 |
%W | 一年的第几周(0-53), where week 1 has the first Monday |
%x | 标准日期字符串 |
%X | 标准事件字符串 |
%y | 用数字表示年份, without the century (0-99) |
%Y | 用数字表示年份, with the century |
%Z | 时区名 |
%% | % |