我目前正在编写系统编程作业,并且在一部分中我需要获取目录中文件的一些信息。转换:uid_t到字符串,off_t到字符串
对于文件统计,我们有ctime()
函数,它将time_t
类型转换为string
并返回一个指向它的指针。
但uid_t
和off_t
类型怎么样?我搜索了互联网,并找不到任何功能。或者,如果没有任何功能,你能告诉我如何实现这样的功能吗?
我目前正在编写系统编程作业,并且在一部分中我需要获取目录中文件的一些信息。转换:uid_t到字符串,off_t到字符串
对于文件统计,我们有ctime()
函数,它将time_t
类型转换为string
并返回一个指向它的指针。
但uid_t
和off_t
类型怎么样?我搜索了互联网,并找不到任何功能。或者,如果没有任何功能,你能告诉我如何实现这样的功能吗?
size_t
和off_t
只是无符号整型。 (编辑:off_t
是一个很长的时间?请参阅,教训是,检查您的标题!)
因此,使用sprintf
(或其他)使用“%i”格式说明符转换它们。
关于编辑:废话,我在回答时将size_t
更改为uid_t
。 uid_t
定义于types.h
;看这里。 (这也是一个无符号整型,但一个unsigned short
)
off_t
是long int
:FORMAT = “%LD”
size_t
是unsigned int
:FORMAT = “%U”
您可以使用这些格式在sprintf
函数中转换成char *。
Linux'snprintf()支持类型为size_t
的值的'z'格式说明符。不确定这是多么便携,您需要仔细检查“CONFORMS TO”部分。
对于off_t
,您可能需要转换为最大的无符号整数类型,即unsigned long
并使用“lu”说明符。
两者都被定义为算术类型(http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html),并且在实践中是积极的和积分的。因此,您可以将其转换为无符号long long,并使用带有“%llu”的sprintf转换为字符串。
使用gcc 5.4.0以下行:
printf("user #%ld did this or that!\n", uid);
提出以下警告:
..main.c:133:9: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘uid_t {aka unsigned int}’ [-Wformat=]
我会建议你做同样的,检查你的编译器的输出。 =)
我认为实际的教训是,这些在不同的系统上是不同的大小。 – 2009-04-28 10:23:17
是的,这就是我写“检查标题”的原因。强调“你的”。 :) – tpdi 2009-04-28 19:14:49