Преобразование количества байтов в размер файла в C

Я хочу преобразовать одно число байтов в размер файла (который имеет .KB, .MB и .GB).

Если число равно 0, я не хочу иметь никаких единиц. Если число в точности делится на 1024 (не с плавающей точкой), я напечатаю: x. В противном случае я хочу напечатать числа с плавающей запятой с точностью до одного градуса.

Я сделал код, который, кажется, работает хорошо, но очень громоздко. Я ищу способы сделать мою функцию чище / эффективнее, пожалуйста, это, честно говоря, ОЧЕНЬ некрасиво:

char *
calculateSize( off_t size )
{
  char *result = (char *) malloc(sizeof(char) * 20);
  static int GB = 1024 * 1024 * 1024;
  static int MB = 1024 * 1024;
  static int KB = 1024;
  if (size >= GB) {
    if (size % GB == 0)
      sprintf(result, "%d GB", size / GB);
    else
      sprintf(result, "%.1f GB", (float) size / GB);
  }
  else if (size >= MB) {
    if (size % MB == 0)
      sprintf(result, "%d MB", size / MB);
    else
      sprintf(result, "%.1f MB", (float) size / MB);
  }
  else {
    if (size == 0) {
      result[0] = '0';
      result[1] = '\0';
    }
    else {
      if (size % KB == 0)
        sprintf(result, "%d KB", size / KB);
      else
        sprintf(result, "%.1f KB", (float) size / KB);
    }
  }
  return result;
}

Я был бы очень признателен, если бы у кого-то был лучший способ достичь того же результата, пожалуйста.

6
задан Chris says Reinstate Monica 12 November 2011 в 12:22
поделиться