鸦领主 发表于 2021-1-14 15:40:09

时间族函数 文件搜索相关函数

1.时间族函数

a)time()函数
time()函数返回值的数据类型是time_t(__time64_t)。传递给time()函数的参数是指向time_t数据类型的指针
用处:返回一个值,即格林尼治时间1970年1月1日00:00:00到当前时刻的时长,时长单位是秒。
#include <stdio.h>
#include <time.h>

int main()
{
    time_t t1, t2; //分别声明两种使用方式的赋值对象

    t1 = time(0);   //第一种使用方式
    time(&t2);    //第二种使用方式

    printf("t1=%ld\n", t1);
    printf("t2=%ld", t2);
//打印出来的将是<span style="color:#333333;">1970年1月1日00:00:00到现在的时间,共1610442310秒</span>
    return 0;
}b)localtime()函数
localtime函数原型:struct tm *localtime(const time_t *timer)
返回值:返回指向tm 结构体的指针.tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体.

该函数返回指向 tm 结构的指针,该结构带有被填充的时间信息。下面是 tm 结构的细节:struct time1
{
    int tm_sec;         // 秒,范围从 0 到 59               
    int tm_min;         // 分,范围从 0 到 59            
    int tm_hour;      // 小时,范围从 0 到 23               
    int tm_mday;      // 一月中的第几天,范围从 1 到 31                  
    int tm_mon;         // 月份,范围从 0 到 11            
    int tm_year;      // 自 1900 起的年数               
    int tm_wday;      // 一周中的第几天,范围从 0 到 6            
    int tm_yday;      // 一年中的第几天,范围从 0 到 365                  
    int tm_isdst;       // 夏令时                        
};用处:localtime是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    time_t t;
    time(&t);
    tm*t1=localtime(&t);//月份+1是因为范围是0-11
    printf("%d.%d.%d(星期%d)", t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday,t1->tm_wday);
    return 0; //year+1900是因为他是当前的年数减去1900,如果要显示的正常就要+1900
}

因为星期几范围是0-6,如果是星期日的话他就是0,可以用指针数组来解决这个问题
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    time_t t;
    time(&t);
    tm*t1=localtime(&t);
    char* p[] = { "日","一","二","三","四","五","六"};//
    printf("%d.%d.%d(星期%s)", t1->tm_year + 1900, t1->tm_mon + 1, t1->tm_mday,p);
    return 0;
}


c)mktime()函数
作用是,将时间转换为自1970年1月1日以来持续时间的秒数,发生错误时返回-1。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
int main()
{
    tm p = { 0,24,18,12,1-1,2021-1900 };//将2021.1.12 18点24分0秒转换为秒
    time_t t =mktime(&p); //1970年1月1日00:00:00到数入的时间,之间的时间转换为秒
    printf("%d秒", t);
    return 0;
}


2.查找文件想关函数
本次函数用到#include <io.h>
a)_findfirst()函数和_findnext()函数和_findclose()函数


①_findfirst函数原型:long _findfirst(const char *, struct _finddata_t *)
第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件
第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。
_findfirst 函数返回的是匹配到文件的句柄,数据类型为long
作用:搜索与指定的文件名称匹配的第一个实例

②_findnext函数原型:int _findnext(long, struct _finddata_t *);

第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1L。
作用:搜索与_findfrist函数提供的文件名称匹配的下一个实例,若成功则返回0,否则返回-1L

③_findclose()函数原型:int _findclose(long);
只有一个参数,文件句柄。若关闭成功返回0,失败返回-1L。
作用:用于释放由FindFirst分配的内存

④_finddata_t结构体详细
struct _finddata32_t
{
    unsigned    attrib;         
    __time32_ttime_create;
    __time32_ttime_access;   
    __time32_ttime_write;
    _fsize_t    size;
    char      name;
};
unsigned    attrib:文件属性的存储位置
_A_ARCH 0x20(存档)、 _A_HIDDEN 0x02(隐藏)
_A_NORMAL 0x00(正常)、_A_RDONLY 0x01(只读)
_A_SUBDIR 0x10(文件夹)、_A_SYSTEM 0x04(系统)
__time32_ttime_create:存储文件创建时间   
__time32_ttime_access:文件最后一次被访问的时间。   
__time32_ttime_write:文件最后一次被修改的时间。
_fsize_t    size:文件的大小(字节数表示)。
char      name:文件名称

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <io.h>
int main()
{
    _finddata_t file; //定义一个结构体对象
    long handle = _findfirst("C:\\*.*", &file);//定义一个句柄handle,将_findfirst查找的结果赋值给他

    if (handle == -1L) //
    {
      printf("查找失败" );
    }
    else
    {
      do
      {
            if (!(file.attrib & _A_HIDDEN))//显示非隐藏文件,将!取下就是显示隐藏文件
                  printf("%s,%d\n", file.name, file.size);//打印文件的名称,大小
      } while (_findnext(handle, &file) == 0);//判断下一个匹配的实列,成功返回1,失败返回0
    }
    _findclose(handle); //关闭句柄
    return 0;
}

⑤磁盘扫描(递归)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <io.h>
#include<string.h>
void dg(char* sm, char* ss)
{
    _finddata_t file;
    char s;
    strcpy(s, sm);//将输入的复制给s
    strcat(s, "\\*.*");//在合并,比如输入的是c:合并后是c:\\*.*
    long handle = _findfirst(s, &file);//搜索c盘下所有的内容
    if (handle == -1L)
    {
      printf("查找失败");
      return;
    }
    do
    {
      if ((strcmp(file.name, ss) == 0))//判断搜索的文件名称是否与输入的名称一样
      {
            puts(s);//打印路径
            printf("%s,%d\n", file.name, file.size);//则打印
            return;
      }
      if (!(file.attrib & _A_HIDDEN))//如果不是隐藏文件
      {
            if ((file.attrib & _A_SUBDIR))//如果 file.attrib & _A_SUBDIR判断文件属性是文件夹
            {
                if (strcmp(file.name, ".") && strcmp(file.name, ".."))//每个文件的前俩个都是.和..为了方便直接判断
                {

                  char r;
                  strcpy(r, sm);//将输入的c:给r
                  strcat(r, "\\");// C:\\合并
                  strcat(r, file.name);//在将搜索的第一个文件名称合并 c:\\Action!
                  dg(r, ss);//带入函数继续扫描
                }
            }
      }
    } while (_findnext(handle, &file) == 0);
    _findclose(handle);
}
int main()
{
    char c;
    char b;
    printf("请输入磁盘");
    scanf("%s", &c);
    printf("请输入名称");
    scanf("%s", &b);
    dg(c, b);
    return 0;
}
这个失败应该是,没有权限打开某些文件,然后返回了-1L
还有很多地方没有完善

页: [1]
查看完整版本: 时间族函数 文件搜索相关函数