自学嵌入式第二十天高级编程篇 文件3

目录

文件描述符和文件流指针的转换 

        fileno

        fdopen

目录操作

        步骤:

        相关函数

                opendir

                readdir

                closedir

                chdir

                getcwd 

                mkdir

                rmdir

                stat

关于时间的函数

        time

        localtime

        ctime

文件描述符和文件流指针的转换 

        fileno

                文件流指针转换成文件描述符

int fileno(FILE *stream);    //函数原型

//参数
//stream 文件流指针

//返回值    成功返回文件描述符,失败返回-1

        fdopen

                文件描述符转文件流指针

FILE *fdopen(int fd, const char *mode);    //函数原型

//参数
//fd    文件描述符
//mode  文件的权限,注意:是字符串类型,应该选择标准IO fopen中的mode选项

//返回值    成功返回文件流指针,失败返回NULL

目录操作

        将目录当文件看,只不过操作函数和操作文件函数不一样

        步骤:

                1.代开目标目录

                2.读取目录

                3. 关闭目录

        相关函数

                opendir

DIR *opendir(const char *name);    //函数原型

//功能
//打开目录

//参数
//name 目录的名称,也可填路径名称

//返回值
//成功 返回目录流指针,失败则返回NULL

                readdir

struct dirent *readdir(DIR *dirp);    //函数原型

//功能
//读取目录

//参数
//dirp 目录流指针

//返回值
//成功 返回struct dirent 类型的结构体,失败或者读到目录结尾则返回NULL

//结构体内容
struct dirent {
               ino_t          d_ino;       /* 目录编号 */
               off_t          d_off;       /* 偏移量*/
               unsigned short d_reclen;    /* 表示dirent结构体的长度*/
               unsigned char  d_type;      /* 目录类型 */
               char           d_name[256]; /* 目录名字 */
           };     

                closedir

int closedir(DIR *dirp);    //函数原型

//功能
//关闭目录

//参数
//dirp 目录流指针

//返回值
//关闭成功返回0,失败返回-1

                        用上述三个函数完成目录的遍历

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <dirent.h>

int main(int argc, const char *argv[])
{
	DIR *dir = opendir("./");    //打开当前目录

	if (dir == NULL)        //判断是否成功打开
	{
		fprintf(stderr,"opendir error\n");
		return -1;
	}


	while (1)
	{
		struct dirent *info = readdir(dir);    //读取目录
		
		if (info == NULL)    //判断是否读完目录,读完退出循环
		{
			break;
		}

		printf("%s\n",info->d_name);    //打印出目录结构体中的文件名
	}

	closedir(dir);    //关闭目录

	return 0;
}

                chdir

int chdir(const char *path);    //函数原型

//功能
//切换目录

//参数
//path 目录的路径

//返回值
//成功切换到正确路径的目录返回0,失败则返回-1

                getcwd 

char *getcwd(char *buf, size_t size);    //函数原型

//功能
//获取当前工作目录的路径

//参数
//buf    表示工作路径字符串存储到哪个空间
//size   表示读取这个字符串多大,防止读取时目录字符串过长超出buf大小

//返回值
//成功读取当前工作目录返回buf的首地址,失败则返回NULL

                         实例:找到某个目录中的.c文件打印在屏幕上

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>

int main(int argc, const char *argv[])
{
	if (argc < 2)
	{
		fprintf(stderr,"input a pathname\n");    //如果传入的参数小于2个,则提示传入路径
		return -1;
	}

	int c = chdir(argv[1]);    //切换到目标路径
	if (c == -1)
	{
		fprintf(stderr,"chdir error\n");
		return -1;
	}

	DIR *dir = opendir("./");    //打开当前目录

	while (1)
	{
		struct dirent * info = readdir(dir);    //读取当前目录

		if (info == NULL)
		{
			break;
		}

		int len = strlen(info->d_name);

		if ((info->d_name)[len-1] == 'c' && (info->d_name)[len-2] == '.')    //如果文件以.c结尾,就打印出来
		{
			printf("%s\n",info->d_name);
		}
	}

    closedir(dir);    //关闭目录

	return 0;
}

                mkdir

int mkdir(const char *pathname, mode_t mode);    //函数原型

//功能
//创建一个目录

//参数
//pathname    目录名
//mode        目录的权限

//返回值
//成功创建目录时返回0,错误发生返回-1

                rmdir

int rmdir(const char *pathname);    //函数原型

//功能
//删除一个目录    这个函数只能删除空目录

//参数
//pathname    目录名,可以是路径名

//返回值
//成功删除返回0,失败或者出错返回-1

                stat

int stat(const char *pathname, struct stat *statbuf);    //函数原型

//功能
//获取文件或者目录的详细信息

//参数
//pathname    目录名或者路径
//statbuf     struct stat 类型的结构体的地址

//返回值
//成功写入结构体则返回0,失败则返回-1

                 通过man手册可以查询到以下带参宏,将返回的结构体中的mode填入以下宏中,可以盘算文件的类型

                S_ISREG(m)  is it a regular file?

                S_ISDIR(m)  directory?

                S_ISCHR(m)  character device?

                S_ISBLK(m)  block device?

                S_ISFIFO(m) FIFO (named pipe)?

                S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)

                S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)

                通过mode与下列宏进行位与的操作可以判断该文件的权限

               S_IRUSR      00400   owner has read permission
               S_IWUSR     00200   owner has write permission
               S_IXUSR      00100   owner has execute permission
               S_IRGRP      00040   group has read permission
               S_IWGRP     00020   group has write permission
               S_IXGRP      00010   group has execute permission
               S_IROTH      00004   others have read permission
               S_IWOTH     00002   others have write permission
               S_IXOTH      00001   others have execute permission

                使用stat函数时应多查询man手册,看清楚结构体中的成员的含义才能熟练使用

关于时间的函数

        time

time_t time(time_t *tloc);    //函数原型

//功能
//获取1970年至今的时间(秒数)

//参数
//

//返回值
//

//使用方法
time_t tm;

time(&tm);          //方法一

tm = time(NULL);    //方法二

        localtime

struct tm *localtime(const time_t *timep);    //函数原型

//功能
//将秒数转换成正常时间形式

//参数
//timep    time_t类型的指针

//返回值
//返回一个struct tm类型的结构体

        ctime

char *ctime(const time_t *timep);    //函数原型

//功能
//转换时间

//参数
//timep time_t 类型的指针

//返回值
//成功返回一个字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值