Ayuda con fprintf

Iniciado por Luchoz95, 19 Abril 2013, 19:08 PM

0 Miembros y 3 Visitantes están viendo este tema.

Luchoz95

Hola gente tengo un problema , va mas que un problema una consulta , vean esta linea de código ...

fprintf(miarchivo,"%s%s%d",nPersona.nombre,nPersona.apellido,nPersona.telefono);

esto va a escribir en un archivo de la siguiente manera ...
CitarNombre
Apellido
156XXXX
bueno yo lo que quiero es que se escriba asi ...
CitarNombre           Apellido          156XXXX

con algún tipo de tabulacion o algo por el estilo , algún consejo ? S2!

pacoperico

Pues usa la secuencia de escape de la tabulacion que es \t en tu cadena de formato del frintf().

rir3760

Cita de: Luchoz95 en 19 Abril 2013, 19:08 PMyo lo que quiero es que se escriba asi ... con algún tipo de tabulacion o algo por el estilo , algún consejo?
Para imprimir en el archivo una linea de texto con el formato que mencionas puedes utilizar:
fprintf(
   miarchivo, "%-Xs%-Ys%-Zd",
   nPersona.nombre,
   nPersona.apellido,
   nPersona.telefono
);


En la cadena de formato "%-Xs%-Ys%-Zd" se utiliza "-" para indicar una alineación a la izquierda mientras que "X", "Y" y "Z" indican la anchura en caracteres de cada campo o columna.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

Simple,claro y preciso. Me encantan tus lecciones rir3760. Siempre aprendiendo de tus respuestas.

Gracias por compartir tus amplísimos conocimientos  de C/C++ con los demás y "por nada".

Un fuerte saludo, "fenómeno".

Luchoz95

sigo con el mismo problema , se hace un salto de linea aunque le agrege esto ..
fprintf(miarchivo,"%-50s%-50s%-50d",nPersona.nombre,nPersona.apellido,nPersona.telefono);

no se que ondaa :S

rir3760

Cita de: Luchoz95 en 19 Abril 2013, 22:01 PMsigo con el mismo problema , se hace un salto de linea aunque le agrege esto ..
fprintf(miarchivo,"%-50s%-50s%-50d",nPersona.nombre,nPersona.apellido,nPersona.telefono);
La razón del avance de linea no es la llamada a función sino alguna de las cadenas. Lo mejor aquí es, cuando obtengas las cadenas, eliminar el avance de linea.

Si no es posible y alguna de ellas puede contener el mentado carácter se puede verificar y de ser necesario eliminarlo. Una opción es mediante la función strchr (prototipo en <string.h>), mas o menos así:
#include <string.h>

/* ... */

char *p;

/* ... */

p = strchr(nPersona.nombre, '\n');
if (p != NULL)
   *p = '\0';

p = strchr(nPersona.apellido, '\n');
if (p != NULL)
   *p = '\0';

fprintf(
   miarchivo, "%-50s%-50s%-50d",
   nPersona.nombre, nPersona.apellido, nPersona.telefono
);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Luchoz95

eh probado con lo que me pasaste pero tampoco funciono , pero ya encontre el error , ahora tengo que solucionarlo ... el error esta en esta linea ...
fgets(nPersona.nombre,50,stdin);
ahora estoy usando scanf para leer los nombres y apellidos , pero no le tengo muchas confianza , algun consejo ? S2!

rir3760

Cita de: Luchoz95 en 20 Abril 2013, 03:35 AMeh probado con lo que me pasaste pero tampoco funciono
El problema al solo comentar "no funciona" es que no hay forma de corregir el código fuente (el que sea).

Cita de: Luchoz95 en 20 Abril 2013, 03:35 AMpero ya encontre el error , ahora tengo que solucionarlo ... el error esta en esta linea ...
fgets(nPersona.nombre,50,stdin);
Con ello los campos nombre y apellido almacenaran el avance de linea como ultimo carácter, como ya te comente ese es el problema.

Un programa donde se muestra como eliminar el avance de linea e imprimir con formato:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CHARS  256

struct reg {
   char nombre[MAX_CHARS];
   char apellido[MAX_CHARS];
   long telefono;
};

int main(void)
{
   struct reg nPersona;
   char *p;
   
   puts("Nombre:");
   fgets(nPersona.nombre, MAX_CHARS, stdin);
   p = strchr(nPersona.nombre, '\n');
   if (p != NULL)
      *p = '\0';

   puts("Apellido:");
   fgets(nPersona.apellido, MAX_CHARS, stdin);
   p = strchr(nPersona.apellido, '\n');
   if (p != NULL)
      *p = '\0';
   
   nPersona.telefono = 123456789;
   
   fprintf(
      stdout, "%-30s%-30s%-18ld\n",
      nPersona.nombre, nPersona.apellido, nPersona.telefono
   );
   
   return EXIT_SUCCESS;
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Luchoz95

Sos un genio !, Muchas gracias.
S2!