He adaptado este problema a un ejercicio, que consiste en:
1º Abrir un fichero binario introducir datos de clientes.
2º Cambiar los saltos de línea que separan cada registro por comas.
3º Mostrar el fichero, es decir, imprimir por pantalla los registros separados por comas.
Este es el programa:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEE_CHAR(c)\
c=getchar();\
while((c=='\n') || (c==' ') || (c=='\t'))\
c=getchar();
#define LEE_CAD(c,n) { int i=0; \
c[i]=getchar();\
while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
while ((c[i]!='\n') && (i < (n-1))){ \
i++;\
c[i]=getchar(); }\
c[i]='\0'; }
#define TAM_NOMBRE 100
#define TAM_DIR 100
struct cliente{
char nombre[TAM_NOMBRE];
char direccion[TAM_DIR];
double deuda;
};
int main(){
void crear_fich();
void cambiar_salto_por_coma();
void mostrar_fich();
char op;
FILE *pf; //Puntero a fichero
/* Abre el fichero para trabajar con él en Lectura / Escritura */
if((pf
= fopen("datos.dat", "ab+")) == NULL
) { /* Si no existe, ejecuta el módulo que lo cree */
crear_fich();
/* Una vez creado lo habre en lectura/escritura */
if((pf
= fopen("datos.dat", "ab+")) == NULL
) { perror("Fichero no accesible"); }
}
do{
printf("1). Crear fichero.\n"); printf("2). Cambiar salto de linea por coma.\n"); printf("3). Mostrar fichero.\n"); printf("0). Salir\n\nOpción(0-9): "); do{
LEE_CHAR(op);
}while( (op <'0') || (op >'3') );
switch(op){
case '1':
crear_fich(pf);
/* Una vez creado lo abre en lectura/escritura */
if((pf
= fopen("datos.dat", "rb+")) == NULL
) { perror("Fichero no accesible"); }
break;
case '2': cambiar_salto_por_coma(pf);
break;
case '3': mostrar_fich(pf);
break;
} //switch
}while(op!='0');
printf("Error al cerrar el fichero.\n"); }//main()
////////////////////////////////////////////////////////////////////////
void crear_fich(FILE* pf) {
struct cliente cli;
char otro;
if((pf
= fopen("datos.dat", "wb")) == NULL
) { perror("Al crear el fichero de datos"); }
/* Lectura de los ciclistas */
do {
cli.deuda = 0.0;
printf("Nombre: "); LEE_CAD
(cli.
nombre, TAM_NOMBRE
); printf("Dirección: "); LEE_CAD
(cli.
direccion, TAM_DIR
); /*Escribe el cliente en el fichero */
fwrite(&cli
, sizeof(struct cliente
), 1, pf
); LEE_CHAR(otro);
}while((otro=='s') || (otro=='S'));
printf("Error al cerrar el fichero, compruebe si hay información.\n"); }
} /* crear_fich()*/
///////////////////////////////
int cambiar_salto_por_coma(FILE *pf){
char letra;
// Abro el fichero
pf
= fopen("datos.dat","rb");
// Si ha dado fallado termino
if ( pf == NULL )
{
printf("Error al abrir el fichero.\n"); return 1;
}
else{
while ( !feof(pf
) ){ // Mientras no sea final de fichero
if(letra == '\n'){
letra = ',';
}
printf("%c",letra
); // Muestra el caracter leido }
// Cerrar fichero
return 0;
}
}
//////////////////////////////////
void mostrar_fich(FILE *pf){
struct cliente cli;
fread(&cli
,sizeof(struct cliente
),1,pf
); printf("%s %s %.2lf\t\n\n",cli.
nombre, cli.
direccion, cli.
deuda); fread(&cli
,sizeof(struct cliente
),1,pf
); }
}
Cuando compilo me da dos errores:
cambiar_salto_por_coma.c:101: error: tipos en conflicto para ‘cambiar_salto_por_coma’
cambiar_salto_por_coma.c:28: error: la declaración previa de ‘cambiar_salto_por_coma’ estaba aquí