2013-10-04 2 views
4

Кто-нибудь знает, что является заполнителем для типа ino_t? Я пытаюсь распечатать его с помощью printf и попробовал% d,% i,% s и другие, но не работал.Заполнитель для ino_t

printf(" file name = %s, i-node number=**%d**\n", direntp->d_name, direntp->d_ino); 

warning: format ‘%i’ expects argument of type ‘int’, but argument 3 has type ‘__ino_t’ [-Wformat] 

Предположим, что мои другие коды верны. В большинстве примеров показано, как печатать имя, но не номер inode. Я также искал много мест.

Заранее спасибо

+0

http://stackoverflow.com/questions/18534336/does-posix-supply-format-string-macros-for-printf-scanf – szx

ответ

8

Если вы знаете тип является неотъемлемой частью, вы можете привести его к unsigned long long и использовать %llu.

printf(" file name = %s, i-node number=%llu\n", 
     direntp->d_name, (unsigned long long)direntp->d_ino); 
+0

Да. Я дал почти такой же ответ. Слово за слово. В то же время. :) –

7

Для справки: эти термины называются «спецификаторами преобразования».

Насколько я знаю, нет спецификатора преобразования для ino_t. Если вы уверены, что это целое число, то отбрасывайте его до unsigned long long и используйте "%llu".

+1

Конечно, +1, потому что у меня нет много возможностей, чтобы повысить свой собственный ответ. ;-) – jxh

+0

@jxh по той же причине. Бывает так редко :) –

+0

Самым безопасным было бы, однако, использовать 'intmax_t' из [' stdint.h'] (http://pubs.opengroup.org/onlinepubs/000095399/basedefs/stdint.h.html) и ' PRIdMAX' из ['inttypes.h'] (http://pubs.opengroup.org/onlinepubs/000095399/basedefs/inttypes.h.html). IOW, 'printf (" ino =% "PRIdMAX" \ n ", (intmax_t) direntp-> d_ino);'. Или, поскольку он, вероятно, должен быть неподписанным, 'printf (" ino =% "PRIuMAX" \ n ", (uintmax_t) direntp-> d_ino);'. – glglgl

-1

ino_t is typedef to unsigned long. Таким образом, квалификатор для печати такой же -% lu.

+3

Будет ли это справедливо для всех платформ? –

+0

Спасибо, хорошо работает. – Newbie

+1

Я вполне уверен, что есть системы, которые имеют 32-битные 'long's и 64-битные inums. Таким образом, ваш ответ определенно неверен. – glglgl

Смежные вопросы