2009-04-28 2 views
1

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

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

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

ответ

2

size_t и off_t являются просто неподписанными интегральными типами. (Редактировать: off_t длинный? Посмотрите, урок есть, проверьте свои заголовки!)

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

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

+1

Я думаю, что фактический урок состоит в том, что они разных размеров для разных систем. –

+0

Да, поэтому я написал «проверьте ваши заголовки». Акцент на «ваш». :) – tpdi

0

off_t является long int: формат = "% л.д."

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

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

+1

Я не верю, что они гарантированно будут такими типами на всех платформах. –

+0

Вы правы, но поскольку они не являются форматом для off_t или size_t, это единственное решение. Это можно улучшить с помощью теста предварительной обработки, чтобы знать платформу. –

+0

Почему вы не можете просто увеличить значения до unsigned long long? –

1

Linux 'snprintf() поддерживает спецификатор формата' z 'для значений типа size_t. Не уверен, насколько это переносимо, вам нужно внимательно ознакомиться с разделом «CONFORMS TO».

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

4

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

0

Использование 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=]

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