Преобразование: uid_t в строку, off_t в строку

В настоящее время я пишу домашнее задание по системному программированию, и в одной части мне нужно получить некоторую информацию о файле в каталоге.

для статистики файла у нас есть функция ctime(), которая преобразует тип time_t в string и возвращает указатель на него.

а как насчет типов uid_t и off_t? Я искал в Интернете и не смог найти ни одной функции.. Или, если такой функции не существует, не могли бы вы сказать мне, как реализовать такую ​​​​функцию, пожалуйста?


person israkir    schedule 28.04.2009    source источник


Ответы (5)


Оба определены как арифметические типы (http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html), и на практике являются положительными и неотъемлемыми. Таким образом, вы можете просто преобразовать unsigned long long и использовать sprintf с «%llu» для преобразования в строку.

person Matthew Flaschen    schedule 28.04.2009

size_t и off_t — это просто целочисленные типы без знака. (Редактировать: off_t длинное? Видите, урок в том, проверьте свои заголовки!)

Поэтому используйте sprintf (или что-то еще), чтобы преобразовать их, используя спецификатор формата "%i".

При редактировании: дерьмо, ты изменил size_t на uid_t, пока я отвечал. uid_t определяется в types.h; посмотреть там. (Это также целочисленный тип без знака, но unsigned short.)

person tpdi    schedule 28.04.2009
comment
Я думаю, что реальный урок заключается в том, что это разные размеры в разных системах. - person Matthew Flaschen; 28.04.2009
comment
Да, именно поэтому я написал, проверьте ваши заголовки. Акцент на вашем. :) - person tpdi; 28.04.2009

snprintf() в Linux поддерживает спецификатор формата 'z' для значений типа size_t. Не уверен, насколько это портативно, вам нужно внимательно изучить раздел «СООТВЕТСТВУЕТ СООТВЕТСТВУЮЩЕМУ».

Для off_t вам может потребоваться привести к наибольшему целочисленному типу без знака, т. е. unsigned long, и использовать спецификатор "lu".

person unwind    schedule 28.04.2009

off_t это long int: формат = "%ld"

size_t является unsigned int: формат = "%u"

Вы можете использовать этот формат в функции sprintf для преобразования в char*.

person Jérôme    schedule 28.04.2009
comment
Я не верю, что они гарантированно будут такими на всех платформах. - person Matthew Flaschen; 28.04.2009
comment
Вы правы, но так как они не форматируют для off_t или size_t, это единственное решение. Это можно улучшить, используя тест предварительной обработки, чтобы узнать платформу. - person Jérôme; 28.04.2009
comment
Почему вы не можете просто расширить значения до unsigned long long? - person Matthew Flaschen; 28.04.2009

Используя 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=]

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

person Bora M. Alper    schedule 22.06.2017