Comment utiliser printf pour afficher off_t, nlink_t, size_t et d'autres types spéciaux?
Dans mon programme, j'ai stat les fichiers qu'ils veulent et envoyer les données sur. Les champs de stat struct
sont tous les types spéciaux:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
Le code approprié pour ma question suivante:
len = snprintf( statbuf, STAT_BUFFER_SIZE,
"%crwxrwxrwx %lu %u %u %lld %s %s\r\n",
S_ISDIR( filestats.st_mode ) ? 'd' : '-',
(unsigned long ) filestats.st_nlink,
filestats.st_uid,
filestats.st_gid,
(unsigned long long ) filestats.st_size,
date,
filename);
Comment puis-je imprimer ces types dans un portable et efficace? Au début, je le faisais sans moulages en devinant le bon spécificateurs de format. En plus d'être une source de programmation habitude, cela signifiait également que mon code ne fonctionne pas sur un système 32 bits. Maintenant, avec le jette, il semble fonctionner, mais sur la façon dont de nombreuses plates-formes?
- Spécifique pour clock_t : stackoverflow.com/questions/1083142/...
- Pour
__uint128
: stackoverflow.com/questions/11656241/...
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas un portable moyen de le faire, et c'est une nuisance.
C99 fournit un mécanisme pour les types intégrés comme
size_t
avec le%zu
notation (et il y a un peu plus, similaire qualificatifs).Il fournit également le
<inttypes.h>
- tête avec des macros comme PRIX32 pour définir le bon qualificatif pour l'impression d'un 32-bit constante hexadécimale (dans ce cas):Pour le système de types définis (tels que ceux définis par la norme POSIX), autant que je sache, il n'y a pas de bonne façon de les gérer. Donc, ce que je fais est de prendre un vol deviner un " sûr " de la conversion puis de les imprimer en conséquence, y compris la distribution, qui est ce que vous illustrer dans la question. C'est frustrant, mais il n'y a pas de meilleure façon que je connaisse. En cas de doute, et à l'aide de C99, puis la conversion de "unsigned long long" est assez bon; il pourrait y avoir un cas d'utilisation d'un plâtre pour
uintmax_t
et PRIXMAX ou l'équivalent.Ou, comme FUZxxl rappelé moi, vous pouvez utiliser le modificateur
j
pour indiquer un " max " de type entier. Par exemple:size_t
devrait être%zu
commesize_t
est un type non signé...% (uid_t) 10
et/= (uid_t) 10
est entièrement portable.intmax_t
, le modificateur de longueurj
, de sorte que vous pouvez utiliser%ju
pour imprimer unuintmax_t
sans l'aide de l'encombrantinttypes.h
macros.