C语言-常用函数
C语言-常用函数
_finddata_t结构体用法
- 功能:用来存储文件各种信息的结构体
- 依赖:头文件
<io.h>
- 主要语法:
struct _finddata_t{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
}
unsigned attrib
:文件属性的存储位置。它存储一个unsigned
单元,用于表示文件的属性。文件属性是用位表示的,
主要有以下一些:_A_ARCH
(存档)、_A_HIDDEN
(隐藏)、_A_NORMAL
(正常)、_A_RDONLY
(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
这些都是在中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为 1,而其他位为0)。
既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM
。time_t time_create
:time_t
是一个变量类型,实际上就是长整形变量long int
,用来保存从1970年1月1日0时0分0秒到现在时刻的秒数。time_t time_access
:文件最后一次被访问的时间。time_t time_write
:文件最后一次被修改的时间。_fsize_t size
:文件的大小(字节数表示)。char name[_MAX_FNAME]
:文件的文件名。这里的_MAX_FNAME
是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。- 使用:需要
_findfirst()
、_findnext()
和_fineclose()
三个函数的搭配使用来将文件的信息存储到该结构体的内存空间。long _findfirst( char *filespec, struct _finddata_t *fileinfo );
- 返回值:
如果查找成功的话,将返回一个long型的唯一的查找用的句柄。这个句柄将会在_findnext
函数中被使用。失败返回-1. - 参数:
filespec
:标明文件的字符串,可支持通配符。比如:*.c
,则表示当前文件夹下的所有后缀为C的文件。fileinfo
:这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。
- 返回值:
long _findfirst( char *filespec, struct _finddata_t *fileinfo );
- 返回值:若成功返回0,否则返回-1。
- 参数:
handle
:即由_findfirst
函数返回回来的句柄。fileinfo
:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。
int _findclose( long handle );
- 返回值:成功返回0,失败返回-1。
- 参数:
handle
:_findfirst
函数返回回来的句柄。
该结构体和搭配的函数使用的逻辑就是先用_findfirst
查找第一个文件,若成功则用返回的句柄,调用_findnext
函数查找其他的文件,当查找完毕后用,用_findclose
函数结束查找。
- 实例:
#include <stdio.h>
//_finddata_t的使用方法
#include <io.h>
#include<Windows.h>
#include <time.h>
#include <stdint.h>
#define ADDR "F:\\text\\*txt"
const char* SearchAddr = ADDR;
typedef struct{
uint16_t year;
uint8_t month;
uint8_t day;
uint8_t hour;
uint8_t minute;
uint8_t second;
}bj_time;
bj_time timestamp_to_bj_time(time_t timestamp);
time_t bj_time_to_timestamp(bj_time time);
int main(){
long handle;
struct _finddata_t FileInfor;
handle = _findfirst(SearchAddr, &FileInfor);
if(handle== -1)
return -1;
while(!_findnext(handle, &FileInfor)){
time_t timestamp;
timestamp = FileInfor.time_create;
printf("current timestamp: %d\n", timestamp);
bj_time time;
time = timestamp_to_bj_time(timestamp);//时间戳转为时间
printf("file name: %s, created time: %d-%d-%d %d:%d:%d\r\n", FileInfor.name, time.year, time.month, time.day, time.hour, time.minute, time.second);
timestamp = bj_time_to_timestamp(time);//时间转为时间戳
printf("time2 timestamp: %d\r\n", timestamp);
}
_findclose(handle);
system("pause");
return 0;
}
bj_time timestamp_to_bj_time(time_t timestamp)
{
bj_time time;
struct tm *t;
t = localtime(×tamp);
/* 日期修正 */
time.year = t->tm_year + 1900;
time.month = t->tm_mon + 1;
time.day = t->tm_mday;
time.hour = t->tm_hour;
time.minute = t->tm_min;
time.second = t->tm_sec;
return time;
}
time_t bj_time_to_timestamp(bj_time time)
{
struct tm t;
time_t timestamp = 0;
/* 日期修正 */
t.tm_year = time.year - 1900;
t.tm_mon = time.month - 1;
t.tm_mday = time.day;
t.tm_hour = time.hour;
t.tm_min = time.minute;
t.tm_sec = time.second;
//timestamp = mktime(&t) - 8*60*60;
timestamp = mktime(&t);
return timestamp;
}
结果显示:
备注:
参考1:https://blog.csdn.net/wangqingchuan92/article/details/77979669
参考2:https://blog.csdn.net/qq_36347513/article/details/118333782
memset
- 主要语法:
void *memset(void *str, int c, size_t n)
。 - 功能:复制字符
c
(一个无符号字符)到参数str
指向的字符串的前n
个字符。 - 依赖:头文件
string.h
- 参数:
- str -- 指向要填充的内存块。
- c -- 要被设置的值。该值以int形式传递,但是函数在填充内存块时使用无符号字符形式。
- n --要被设置为该值的字符数。
- 返回值:
返回一个指向存储区str
的指针. - 实例:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[50];
strcpy(str,"This is string.h library function");//将后面字符串复制到str
puts(str);//把一个字符串写入到标准输入输出stdout,直到空字符,但不包含空字符。换行符会被追加到输出中
memset(str,'$',7);//复制7个'$'到str
puts(str);//打印str
return(0);
}
结果显示:
strcat_s
函数
- 主要语法:
errno_t strcat_s(char *strDestination , size_t numberOfElements , const char *strSource );
- 功能:
strcat_s
函数与strcat
函数一样,主要用于字符串拼接。 - 依赖:头文件
string.h
- 描述:用于对字符串进行拼接, 将两个字符串连接再一起
- 参数:
strDestination:目标字符串
numberOfElements:拼接后的字符串大小(并非目标字符串大小也并非原始字符串大小)
strSource:需要追加的字符串
- 返回值:
errno_t
是微软新定义的一种类型,这种类型是一种整型,代表错误代码,若果是0 则代表没有错误,如果是其他的值 ,则会抛出一个值; - 实例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char src[1000] = {"world."};
char dst[] = {"hello,"};
int len = strlen(src) + strlen(dst) + 1;
printf("strcat_s之前 dst:%s\n", dst);
strcat_s(dst, len, src);
printf("strcat_s之后 dst:%s\n",dst);
system("pause");
return 0;
}
结果显示:
strcpy
函数
- 主要语法:
char *strcpy(char *dest, const char *src)
。 - 功能:把
src
所指向的字符串复制到dest
。 - 依赖:头文件
string.h
。 - 参数:
dest
-- 指向用于存储复制内容的目标数组。src
-- 要复制的字符串。
- 返回值:
该函数返回一个指向最终的目标字符串dest
的指针。 - 实例:
# include <stdio.h>
# include <string.h>
int main(){
char src[40];
char dst[100];
memset(dst, '\0', sizeof(dst));
strcpy(src, "This is strcpy function");
strcpy(dst, src);
printf("最终的目标字符串:%s\n", dst);
return 0;
}
结果显示:
strtok
函数
- 主要语法:
char *strtok(char *str, const char *delim)
。 - 功能:分解字符串
str
为一组字符串,delim
为分隔符。 - 依赖:头文件
string.h
。 - 参数:
str
-- 要被分解成一组小字符串的字符串delim
-- 包含分隔符的C
字符串
- 返回值:
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。 - 实例:
#include <stdio.h>
#include <string.h>
int main(){
char str[100] = "hello-world";
const char s[2] = "-";
char *token;
token = strtok(str, s);//获取第一个子字符串
printf("1:%s\n",token);
/*继续获取其他的子字符串*/
while(token != NULL){
printf("2:%s\n", token);
token = strtok(NULL, s);
}
return 0;
}
结果:
说明:分解字符串为一组标记串,
str
为要分解的字符串,s
为分隔符字符串。首次调用时,str
必须指向要分解的字符串,随后调用要把str
设成NULL
。strtok
在str
中查找包含在delim
中的字符并用NULL('\0')
来
替换,直到找遍整个字符串。返回指向下一个标记串,当没有标记串时则返回空字符NULL
。
memcpy
函数
- 主要语法:
void *memcpy(void *str1, const void *str2, size_t n)
。 - 功能:从存储区
str2
复制n
个字节到存储区str1
。 - 依赖:头文件
string.h
。 - 参数:
str1
-- 指向用于存储复制内容的目标数组,类型强制转换为void*
指针。str2
-- 指向要复制的数据源,类型强制转换为void*
指针。n
-- 要被复制的字节数。
- 返回值:
该函数返回一个指向目标存储区str1
的指针。 - 实例:
#include <stdio.h>
#include<string.h>
int main()
{
char *s="http://www.runoob.com";
char d[20];
memcpy(d, s+11, 6);// 从第 11 个字符(r)开始复制,连续复制 6 个字符(runoob)
// 或者 memcpy(d, s+11*sizeof(char), 6*sizeof(char));
d[6]='\0';
printf("%s\n", d);
printf("the 11th chars: %s", s + 11);//字符串截断,可以用这种方式
return 0;
}
结果: