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?

InformationsquelleAutor kmm | 2009-09-09