[C con Clase] Buenos Dias

Steven Davidson srd4121 en njit.edu
Mar Jul 27 22:09:50 CEST 2010


Hola Gilberto,

Gilberto Sanchez wrote:
>                         FILE *fa;
> 
>      fa = fopen("empleado.txt", "r+");
> if (fa==NULL)
> 
> {
>   msg_noexiste();
> 
> }  else {
> 
> printf("\nCedula del Empleado: ");
> 
> scanf("%d", &pl.CI);
> 
> printf("\nNombres del Empleado: ");
> 
> scanf("%s %s", &pl.nombres);
> 

Esto no funcionará como esperas. Realizas dos lecturas pero sólo tienes 
un parámetro. En segundo lugar, el campo 'nombres' seguramente es un 
array de 'char' o posiblemente un array de arrays de 'char'. En 
cualquier caso, no deberías conseguir la dirección de memoria del array, 
simplemente porque un array ES una dirección de memoria.

Reescribiríamos el código anterior así, si tenemos la declaración del 
campo: 'char nombres[2][20]',

scanf( "%s %s", pl.nombres[0], pl.nombres[1] );

Si se trata de un solo array de 'char' que guardará dos nombres 
seguidos, entonces necesitas escribir esta lógica. Por ejemplo,

char szAuxNombre[30];

scanf( "%s", pl.nombres );
scanf( "%s", szAuxNombre );

strcat( pl.nombres, " " );          // Agregamos un espacio al final
strcat( pl.nombres, szAuxNombre );  // Concatenamos las cadenas

La otra posibilidad es escribir este comportamiento directamente usando 
'pl.nombres'. Por ejemplo,

int n = scanf( "%s", pl.nombres );
pl.nombres[n++] = ' ';
pl.nombres[n++] = 0;  // carácter nulo

// Guardamos la siguiente cadena al final de 'pl.nombres'
scanf( "%s", &pl.nombres[n] );

> printf("\nApellidos del Empleado: ");
> 
> scanf("%s %s", &pl.apellidos);
> 

Aquí tienes el mismo problema que antes.

> printf("\nDireccion del empleado: ");
> 
> scanf("%s", &pl.direccion);
> 
> printf("\nObservacion acerca del empleado: ");
> 
> scanf("%s", &pl.observaciones);
> 

Nuevamente, intentas obtener la dirección de memoria de un array, cuando 
la verdad es que un array ES una dirección de memoria. Simplemente, escribe:

scanf( "%s", pl.direccion );
scanf( "%s", pl.observaciones );

Ahora bien, posiblemente esto no funciona tan bien como esperas. 
'scanf()' interpreta espacios blancos: ' ', '\t', '\r', '\n', '\f', y 
'\v', como separadores o delimitadores. Esto significa que 'scanf()' se 
detendrá en cuanto lea uno de estos espacios blancos. En tu caso, esto 
seguramente implica que no leerás todas las cadenas, porque estarán 
separads por espacios. En su lugar, deberías usar 'fgets()' para leer 
todos los caracteres hasta encontrar el carácter de fin-de-línea: '\n'. 
Por ejemplo,

fgets( pl.direccion, 60, stdin );
fgets( pl.observaciones, 120, stdin );

Aquí, indicas la cantidad máxima de caracteres en cada array. Ten 
presente que esta función guardará el carácter '\n' en la cadena.

> printf("\nFecha de Ingreso del Empleado: ");
> 
> scanf("%d", &pl.fecha);
> 
> printf("\nTelefono del Empleado: ");
> 
> scanf("%d", &pl.telf);
> 
> fwrite(&pl, sizeof(pl), 1, fa);
> 
> fclose(fa);
> 
> Buenas Partiendo de este codigo que me hace la lectura de datos y lo 
> incluyen en un archivo me gustaria saber como yo PUEDO HACER PARA 
> REALIZAR un modulo de EDICION DE DATOS..
> 
> Mas o menos la logica seria asi !
> 
> 
> - Consigues el empleado en este caso
> - De una lista selecciono que voy a Editar 
> - De ahi como hago la parte de edicion la verdad me tienen un poco 
> confundido me gustaria que me ayudaran :D!
> 

Bueno, esto obviamente requiere decisiones del usuario. Por lo tanto, 
deberías pedir cuanta información necesite tu programa para poder editar 
los campos. Personalmente, aconsejo crear un menú para que el usuario 
elija el campo a editar (cambiar). Por ejemplo,

* Editar *

1. Nombres
2. Apellidos
3. Dirección
4. Observaciones
5. Fecha de Ingreso
6. Teléfono

0. Volver atrás

Opción: _

A partir de aquí el usuario elegirá cuál campo editar. Posteriormente, 
se activará el comportamiento correcto para la opción elegida. Por ejemplo,

Opción: 3[ENTER]

* Observaciones *

Original: ¡Este empleado es malísimo! ¡¡Despídanlo de inmediato!!

Nuevo: _

Aquí el usuario escribiría el nuevo texto. Si quieres, puedes preguntar 
al final si de verdad quiere modificar el valor original del campo. Por 
ejemplo,

Nuevo: ¡Este empleado es buenísimo! ¡¡Súbanle el sueldo de inmediato!!

Aceptar el nuevo valor (S/N): _


Espero que esto te aclare las ideas.

Steven





Más información sobre la lista de distribución Cconclase