Cita de: josri en 15 Marzo 2013, 07:28 AMLa segunda pregunta es como puedo leer el apellido pero que solo quede en un registro de 6 posiciones, por ejemplo:HERNANDEZ se guardaria como HERNAN o DIAZ se guardaria como DIAZ**(* = espacios en blanco), intente hacer esto con substr pero me marca error.Lo ideal seria que utilizaras solo las facilidades de la biblioteca estándar de C++ como la función getline y la clase string ...
Pero si piensas utilizar funciones como fscanf una solución es leer del archivo el apellido y almacenarlo en una variable temporal (eso para evitar ciertos detallitos de la función), a continuación lees del temporal los caracteres necesarios y los imprimes con el formato deseado.
Un ejemplo sencillo en C donde "temp" es la variable temporal y "campo" la ubicación final del apellido:
Código (c) [Seleccionar] 
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   char *ape[] = {
      "HERNANDEZ", 
      "DIAZ", 
      "GONZALEZ", 
   };
   char temp[100];
   char campo[100];
   int i;
   
   for (i = 0; i < 3; i++){
      sscanf(ape[i], "%[^|]", temp);  /* archivo ==> temp  */
      sprintf(campo, "%-6.6s", temp); /*    temp ==> campo */
      
      printf("\"%s\"\n", campo);
   }
   
   return EXIT_SUCCESS;
}Su salida es:
Código [Seleccionar] 
"HERNAN"
"DIAZ  "
"GONZAL"La cadena de formato "%-06.6s" se utiliza para indicar:
1) "-", alineación a la izquierda.
2) "6.", impresión con seis caracteres de ancho, los faltantes serán espacios.
3) ".6", se leen del argumento (en este caso temp) un máximo de seis caracteres.
Un saludo