Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert size_t to string

I'm trying to write a TCP server which a client can use to browse the server's directories. In addition to that I want to send the size of the directory if that is a regular file. The size of the file is saved into a size_t variable under a "stat" struct. I'm doing this here:

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

So now buffer.st_size contains the file's size. Now I want to write() it to the listening socket but apparently I have to convert it to a string somehow. I know this can be done somehow with the bitwise right-shift (>>) operator but it seems too painful to me. Can you help me out here (even if there's no way other that bitwise operators)?

By the way this is not for school or smth...

PS: I'm running this on Linux.

like image 559
revIah Avatar asked Dec 19 '13 15:12

revIah


3 Answers

You can use the members the sprintf()-family of functions to convert "something" to a "string".

#define _POSIX_C_SOURCE 200112L

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

int main(void)
{
  size_t s = 123456789;
  char str[256] = ""; /* In fact not necessary as snprintf() adds the 
                         0-terminator. */

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

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

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

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

  return 0;
}

Prints out:

The size is '123456789'.
like image 98
alk Avatar answered Sep 29 '22 07:09

alk


You know that size_t is unsigned, but the length is unknown. In C99, we have the z modifier for that, making the complete specifier %zu:

size_t s = 123456789;
char str[256];

snprintf(str, sizeof str, "%zu", s);
like image 33
unwind Avatar answered Sep 29 '22 08:09

unwind


char * is not necessarily a string, you can send what you want. Just manage that the other computer use the same protocol.

so you can do that :

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

this is maybe to fast, you may have to take account of the endianness etc.

like image 33
hl037_ Avatar answered Sep 29 '22 07:09

hl037_