c语言scanf函数详解_c语言scanf函数用法详细解释!!

c语言scanf函数详解_c语言scanf函数用法详细解释!!头文件#includedirent.h函数定义intscandir(constchar*dir,structdirent***namelist, int(*select)(conststru

c语言scanf函数详解_c语言scanf函数用法详细解释!!"

头文件
#include <dirent.h>
函数定义
int scandir(const char *dir, struct dirent ***namelist,
			int (*select)(const struct dirent *),
			int (*compar)(const struct dirent **, const struct dirent **));
函数说明

scandir()会扫描参数dir指定的目录文件,经由参数select(转者注:通过Linux的man手册查看函数原型,该形参名为fliter(过滤)可能目的更明确)指定的函数来挑选目录结构至参数namelist数组中,最后再调用参数compar指定的函数来排序namelist数组中的目录数据。每次从目录文件中读取一个目录结构后便将此结构传给参数select所指的函数,select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表选择所有的目录结构。scandir()会调用qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort()。结构dirent定义请参考readdir()。

(转者注:结构体dirent的定义最终在/usr/include/x86_64-linux-gnu/bits/dirent.h文件中找到)

struct dirent { 
   
#ifndef __USE_FILE_OFFSET64
    __ino_t d_ino; 				/* inode number 索引节点号 */
    __off_t d_off; 				/* offset to this dirent 在目录文件中的偏移 */
#else
    __ino64_t d_ino;
    __off64_t d_off;
#endif 
	unsigned short	d_reclen; 	/* length of this d_name 文件名长 */
	unsigned char	d_type; 	/* the type of d_name 文件类型 */
	char			d_name[256];/* file name (null-terminated) 文件名,最长255字符 */
};
返回值

成功则返回复制到namelist数组中的数据结构数目,有错误发生则返回-1。

测试代码如下
example 1
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
 
int main(void)
{ 
   
    struct dirent **entry_list;
    int count;
    int i;
 
    count = scandir("/home/book/workspace", &entry_list, 0, alphasort);
    if (count < 0) { 
   
        perror("scandir");
        return EXIT_FAILURE;
    }
    for (i = 0; i < count; i++) { 
   
        struct dirent *entry;
        entry = entry_list[i];
        printf("%s\n", entry->d_name);
        free(entry);
    }
    free(entry_list);
 
    return 0;
}
example 2

(转者注:为避免程序编译警告,程序已作修改,对自定义函数scan参数类型及返回值进行修正。)

#define _GNU_SOURCE /* 使用versionsort需要加上该宏定义 */
 
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
 
void make_test_data(char *path)
{ 
   
    int i;
 
    for (i = 0; i < 20; i++) { 
   
        char file[128];
        sprintf(file, "file-%d", i);
        creat(file, 0);
    }
}
void scan(char *path, char *title, int (*sort)(const struct dirent **, const struct dirent **))
{ 
   
    struct dirent **entry_list;
    int count;
    int i;
    puts(title);
    count = scandir(path, &entry_list, 0, sort);
    if (count < 0) { 
   
        perror("scandir");
        return;
    }
    for (i = 0; i < count; i++) { 
   
        struct dirent *entry;
        entry = entry_list[i];
        printf("%s\n", entry->d_name);
        free(entry);
    }
 
    printf("\n");
    free(entry_list);
}
 
int main(void)
{ 
   
    char *path = ".";
 
    make_test_data(path);
    scan(path, "alphasort: ", alphasort);
    scan(path, "versionsort: ", versionsort);
    return 0;
}
example 3
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int filter(const struct dirent *entry)
{ 
   
    return entry->d_name[0] == 'a';
}

int main(void)
{ 
   
    struct dirent **entry_list;
    int count;
    int i;

    count = scandir("/usr/include", &entry_list, filter, alphasort);
    if (count < 0) { 
   
        perror("scandir");
        return EXIT_FAILURE;
    }
    for (i = 0; i < count; i++) { 
   
        struct dirent *entry;
        entry = entry_list[i];
        printf("%s\n", entry->d_name);
        free(entry);
    }
    free(entry_list);

    return 0;
}

版权声明

原文链接:C语言:scandir函数详解

今天的文章c语言scanf函数详解_c语言scanf函数用法详细解释!!分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/69152.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注