[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