He modificado el ejercicio que consiste en abrir el fichero binario e introducir datos, luego sustituyo el salto de linea por coma y luego muestro los registros por pantalla:
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();
int 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", "wb+")) == 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", "rb+")) == 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-3): "); 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
if((pf
=fopen("datos.dat","rb"))==NULL
){ printf("Error al abrir el fichero.\n"); return 1;
}
else{
while ( !feof(pf
) ){ // Mientras no sea final de fichero if(letra=='\n'){
letra=',';
}
}
// 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
); }
printf("Error al cerrar el fichero, compruebe si hay información\n"); }
}
Cuando pido que me muestre el fichero, me salen los registros, pero no me ha sustituido el \n por la coma, ¿por qué?
Me sale esto:
pepe aaa 41.14
ana qqq 65.32
pero sin la coma que tiene que separar cada registro que es lo que a mi me interesa, ¿por qué no sale la coma?