dirent struct_读取目录时struct dirent结构体的d_type成员一个小问题
在测试目录操作函数的readdir()函数时,要传递一个struct dirent的结构体去接收读取到的文件的信息。这个结构体在系统帮助手册如下 man 3 readdir:struct dirent {ino_t d_ino; /* inode number 文件节点号 */off_t d_off; /* offset to the next dirent 文件的偏移量 */unsigned short d_reclen; /* length of this record 文件长度 */unsigned char d_type; /* type of file; not supported by all file system types 文件系统支持的文件类型 */char d_name[256]; /* filename 文件名 */};关于这个结构体的成员,除了d_type外,其他成员问题不大,如 d_ino, d_off,d_reclen都是用整型数据来表示数值,d_name是用字符串来表示文件名,而d_type用一个 unsigned char 类型表示文件类型,那么这个文件类型是什么?所以决定打印出来,使用"%c"的格式控制符,结果是 “d_type= ”,是一些垃圾数值,那么问题在哪呢?于是去看来一下这个结构体的定义源码,发现d_type定义如下:
#ifdef __USE_BSD
/* File types for `d_type'. */
enum
{
DT_UNKNOWN = 0,
# define DT_UNKNOWN DT_UNKNOWN
DT_FIFO = 1,
# define DT_FIFO DT_FIFO
DT_CHR = 2,
# define DT_CHR DT_CHR
DT_DIR = 4,
# define DT_DIR DT_DIR
DT_BLK = 6,
# define DT_BLK DT_BLK
DT_REG = 8,
# define DT_REG DT_REG
DT_LNK = 10,
# define DT_LNK DT_LNK
DT_SOCK = 12,
# define DT_SOCK DT_SOCK
DT_WHT = 14
# define DT_WHT DT_WHT
};
由此看出,这个文件类型是用整型数据表示的,并不是以字符的形式来表示,所以在程序中打印文件类型时使用"%d"的格式控制符,结果就打印了相对应的数值。
#include
#include
#include
#include
int main()
{
//打开目录
DIR * pdir = opendir(".");
if(pdir == NULL)
{
perror("opendir");
return -1;
}
//定义一个目录内文件的信息的结构体
struct dirent * pdirent;
//读取目录内容的信息
while((pdirent = readdir(pdir)) != NULL)
{
printf("d_ino= %d\n",pdirent->d_ino);
printf("d_off= %d\n",pdirent->d_off);
printf("d_reclen= %d\n",pdirent->d_reclen);
printf("d_type= %c\n",pdirent->d_type);
printf("d_name= %s\n",pdirent->d_name);
}
int ret = closedir(pdir);
if(ret == -1)
{
perror("closedir");
return -1;
}
return 0;
}
所以就有了一个结论,遇到类似的问题的时候,可以去看看头文件是如何定义这个结构体的,那么我们就按照这个定义的方法来打印(操作)相关的数值。
dirent struct_读取目录时struct dirent结构体的d_type成员一个小问题相关推荐
- Linux总线驱动-02: struct bus_type 结构体
http://blog.csdn.net/cppgp/article/details/6333359 本文测试系统为:Ubuntu 10.10 x86_64 2.6.35-24-generic 上节中 ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
- struct timeval结构体
struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t ...
- linux sock结构体,struct socket结构体详解
在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题. 由这个图可知,内核中的进程可以通过使用struct ...
- struct ethhdr结构体详解
在linux系统中,使用struct ethhdr结构体来表示以太网帧的头部.这个struct ethhdr结构体位于#include<linux/if_ether.h>之中. # ...
- struct timeval结构体 以及 gettimeofday()函数
一.struct timeval结构体 struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Secon ...
- struct device结构体(2.6.23)
struct device结构体(2.6.23) 一.定义: linux/include/linux/device.h struct device { struct klist ...
- struct(结构体)
在实际问题中,一组数据往往具有不同的数据类型. 例如, 在学生登记表中,姓名应为字符型(char[]):学号可为整型(int)或字符型(char[]):年龄应为整型(char):性别应为字符型(cha ...
- struct sk_buff结构体详解
struct sk_buff是linux网络系统中的核心结构体,linux网络中的所有数据包的封装以及解封装都是在这个结构体的基础上进行. 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- struct timeval结构体 以及 gettimeofday()函数、struct timespec结构体
struct timeval结构体 struct timeval结构体在time.h中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __ ...
最新文章
- 多元有序logistic回归_医学统计与R语言:多分类logistic回归HosmerLemeshow拟合优度检验...
- vue2.0小示例一个~~新鲜出炉哦。欢迎大家留言
- KMeans++算法理论和实现
- centos 下载文件很慢_【已解决】Mac中从远程CentOS服务器中加速下载大文件
- Exception和RuntimeException的区别
- Spring框架相关问题
- SQL记录-PLSQL数组
- 52 - LeetCode-13 -罗马数字转整数_罗马数字转数字
- android网页声音大小设置在哪里,怎样调节网页声音的大小
- toolBar——工具栏
- Java-jdk下载以前版本需要的账号
- 关于IBM刀片服务器
- 常用软件分类运维或个人收藏软件必备,及文件夹打包下载
- IOS视频播放器的使用(MPMoviePlayerController)
- Tomcat热部署三种方式的详细说明
- python 8 字典
- 朗兰兹纲领:关于数学大一统的伟大构想
- httpclient中警告Encrypted Alert后断开连接问题处理
- 大数据要学javaweb吗_大数据运维需要学Java吗?
- RPG Maker MV 图块冲突解决、素材管理
热门文章
- 三大开源bi工具_不用无限手套,人人都能开发 BI 系统------开源BI软件,可集成的BI工具...
- SpringBoot使用快递鸟进行电子面单的获取以及打印
- Servers IIS 重启命令
- 桌面运维转网络要做什么准备,高级网工学习路线分享
- JSP面试题(重要)
- VMware虚拟机与本地计算机进行资源共享的教程?
- excel职称计算机考试题怎么做,职称计算机考试EXCEL试题「附答案」
- 19年4月超星尔雅《移动互联网时代的信息安全与防护》期末考试参考答案(94分)
- Java 基本数据类型(四类八种)
- 怎样用eclipse新建一个android项目?用eclipse新建android项目出错?请看下面