Lo que tienes que hacer es generar la cadena primero como te dice nu_kru.
char ind[3]
.
.
.
write(fd,"Numero de bloques: ",19);
sprintf(ind, "%ld", i);
write(fd,ind,3);
Eso es un extracto de código de una antigua práctica mía

. No tiene las comprobaciones de si escribe el número de bytes que debe pero bueno, sólo mételos en un if y ya está. Pero tener tienes que generar el int usando sprintf (o al menos para mí es lo más cómodo, tampoco tengo mucha práctica con esto, lo toqué hace 2 años ya

). Puedes hacer algo así como
sprintf(buffer, "Numero de bloques: %ld", i);
Y hacer sólo un write

.
PD: Usa siempre
snprintf, strncpy... (con la "n") para limitar el número de bytes a manejar. Si no lo haces es un problema de seguridad grave

.
Salu2!!!