2013-12-19 6 views
4

Я пытаюсь написать TCP-сервер, который клиент может использовать для просмотра каталогов сервера. В дополнение к этому я хочу отправить размер каталога, если это обычный файл. Размер файла сохраняется в переменной size_t в структуре «stat». Я делаю это здесь:Преобразование size_t в строку

char *fullName /* The path to the file *. 
/** 
    * Some code here 
    */ 
struct stat buffer; 
lstat(fullName, &buffer) 

Так что теперь buffer.st_size содержит размер файла. Теперь я хочу записать() его в прослушивающий сокет, но, видимо, мне нужно каким-то образом преобразовать его в строку. Я знаю, что это может быть сделано каким-то образом с помощью побитового оператора смены (>>), но мне кажется слишком больным. Можете ли вы помочь мне здесь (даже если нет других побитовых операторов)?

Кстати это не для школы или ... л

PS: Я бегу это на Linux.

ответ

6

Вы можете использовать функции sprintf()-family функций для преобразования «что-то» в «строку».

#define _POSIX_C_SOURCE 200112L 

#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

int main(void) 
{ 
    size_t s = 123456789; 
    char str[256] = ""; 

    snprintf(str, sizeof(str), "%zu", s); 

    fprintf(stdout, "The size is '"); 
    fflush(stdout); 

    write(fileno(stdout), str, strlen(str)); 

    fprintf(stdout, "'.\n"); 

    return 0; 
} 

Печатает:

The size is '123456789'. 
+0

Для тех, кто не имеет верхнюю часть головы ... Вы знаете свой материал! ;-) –

+0

У меня плохой опыт работы с памятью с помощью sprintf() и snprintf(), но это не совсем то, что я хочу, и это моя вина. Я не очень хорошо объяснил это. Я действительно хочу преобразовать размер этого в его масштабирование. например, 123456789 будет написано «117,73 МБ». Теперь я знаю, что могу использовать тот факт, что числа 0-9 имеют один и тот же код ascii для ints и строк, но я не знаю, как его реализовать. Я пробовал несколько вещей, но я терпеть неудачу каждый раз. Спасибо за ваш вклад уже. – revIah

+0

@ user3119598: «У меня плохой опыт работы с памятью с помощью sprintf() и snprintf() ... *« все это просто вопрос обучения. Эти функции сохраняются и используются напрямую. Они гораздо менее опасны, чем их использование, например, их коллеги из 'scanf *()' -clan. Поезжайте, чтобы использовать 'srintf()' -функции, поскольку они являются существенными. – alk

1

char * не обязательно является строкой, вы можете отправить то, что вы хотите. Просто управляйте тем, что другой компьютер использует один и тот же протокол.

так что вы можете сделать:

write(socket, &(buffer.st_size), sizeof(size_t)); 

это может быть, чтобы быстро, вы, возможно, придется принять во внимание порядок байт и т.д.

+0

Это должна быть строка, потому что она будет частью HTML-страницы. – revIah

+0

Хорошо, «но, видимо, мне нужно каким-то образом преобразовать его в строку», меня ввели в заблуждение;) –

3

Вы знаете, что size_t беззнаковым, но длина неизвестна , В C99, мы имеем z модификатора для этого, делая полный Тендерный %zu:

size_t s = 123456789; 
char str[256]; 

snprintf(str, sizeof str, "%zu", s); 
Смежные вопросы