Imprimir texto+int en llamada al sistema write

Hola gente!

Veréis, me han mandado un ejercicio en el que hay que leer un archivo, de 80 en 80 bytes, y escribirlo en otro archivo, separando esos bloques de 80. (Hay que hacerlo con llamadas al sistema Linux, osea con el write)

Osease:

Bloque numero : 1
TEXTO TEXTO TEXTO

Bloque numero : 2
TEXTO TEXTO TEXTO
..
..
..

El ejercicio lo tengo prácticamente terminado, el problema es que no consigo hacer que escriba el numero de bloque. Tengo una variable contador como int, pero cuando compilo siempre me da este error si meto la variable en el write.
ej2_2.c:54:3: warning: passing argument 2 of ‘write’ makes pointer from integer without a cast [enabled by default]


He aqui mi codigo: http://pastebin.com/eYW9ZSqg

Un saludo y gracias!
por normal general, cualquier warning en C es un fallo de programación y o conceptos.

mmm.. ,cuando usas ("\n\nSoy el bloque :%c",contador), estas esperando que devuelva un puntero a buffer, pero esto no devuelve nada, es mas no tengo muy claro que es lo que espera gcc Si quieres generar la cadena, puedes usar snprintf
Un puntero? Si la variable contiene un entero que se va incrementando. No se que a que te refieres con puntero.

snprint.. mm...

El caso es que tenemos que escribir lo que he comentado en un archivo, y tiene que ser con el write, ya que se trata de hacerlo con llamadas al sistema.

Un saludo y gracias
Se supone que el segundo argumento de la llamada write recibe una variable de tipo 'const void *' y tu lo que le pasas es un 'int'. Realizando un type casting o conversion de tipos, el mensaje del compilador se soluciona.

if(write(fd2,(const void*)("\n\nSoy el bloque :%c",contador),23) != 23) {
madh escribió:Se supone que el segundo argumento de la llamada write recibe una variable de tipo 'const void *' y tu lo que le pasas es un 'int'. Realizando un type casting o conversion de tipos, el mensaje del compilador se soluciona.

if(write(fd2,(const void*)("\n\nSoy el bloque :%c",contador),23) != 23) {


Con lo que me habeis recomendado:
      if(write(fd2,(const void*)("\n\nSoy el bloque :%c",contador),23) != 23) {   // ESCRIBIMOS LA LINEA DE SEPARACION

Compilo y me sale lo siguiente:

ej2_2.c: In function ‘main’:
ej2_2.c:53:16: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
   if(write(fd2,(const void*)("\n\nSoy el bloque :%c",contador),23) != 23) { // ESCRIBIMOS LA LINEA DE SEPARACION
         
creo que cambiando %c por %d podría funcionar, para sacar un tipo char, este debe ser de un solo byte, los int usan al menos dos bytes, dependiendo de la plataforma. Tambien puedes cambiar el while(1=1) por while(true) o for(;;;)

Un saludo
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 XD). 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!!!
6 respuestas