Hola, tengo un fichero binario con varios registros, lo que quiero es sustituir el salto de linea que separa a cada registro por una coma, para así a la hora de imprimirlos me saga cada registro separado por una coma.
Primero se trata de abrir el fichero binario en lectura ir leyendo caracter a caracter y en cuanto encuentra el salto de linea sustituirlo por la coma y cuando llegue al final cerrar el fichero.
Yo he empezado haciendo esto, pero me da error de lectura.
#include <stdio.h>
int main(){
char nom_fich[50];
char caracter;
FILE *pf;
printf("Introduzca nombre del fichero: ");
scanf("%49s", nom_fich);
if((pf = fopen("datos.dat", "rb")) == NULL) {
printf("Error al abrir el fichero.\n");
}
else{
caracter = getc(pf);
while(caracter != EOF){
printf("%c", caracter);
caracter = getc(pf);
}
if(feof(pf)==0){
printf("Error de lectura.\n");
}
fclose(pf);
}
return(0);
}
emm y si le pones un poquito de C++ :P? y usas el método replace
pregunta, el fichero que intentas leer es el correcto "datos.dat" (si esta en el mismo directorio y demas)?
luego lees un nombre de fichero pero no lo utilizas "nom_fich[50]"
He intentado hacerlo de otra manera y si que lee caracter a caracter el fichero "datos.dat", este es el programa:
#include <stdio.h>
int main()
{
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.");
return 1;
}
else{
letra = getc(pf);
while ( !feof(pf) ) // Mientras no sea final de fichero
{
printf("%c",letra); // Muestra el caracter leido
letra = getc(pf);
}
// Cerrar fichero
fclose(pf);
getchar();
return 0;
}
}
Ahora cómo hago para decirle que cuando encuentre un salto de linea me lo sustituya por una coma porque no tengo mucha idea.
ya que lo estas leyendo en binario podrias compararlo con el codigo ascii de salto de linea y en caso de ser dicho caracter hacer una sustitucion, pero tambien puedes usar como comentaron C++ con replace que seria mas comodo.
Aca te dejo un codigo, para que mas o menos te des una idea de como puedes implementar algo...
#include <stdio.h>
int main( void )
{
FILE *f;
char letra;
f = fopen( "datos.dat", "rb" );
if ( f == NULL )
{
puts( "ERROR: No se pudo abrir el fichero" );
return -1;
}
letra = getc( f );
while ( !feof( f ) )
{
if ( letra == 10 ) // 10 = salto de linea (ASCII)
letra = ',';
printf( "%c", letra );
letra = getc( f );
}
putchar( '\n' );
fclose( f );
return 0;
}
Salu10.
He aplicado este ejercicio a un programa que da de alta clientes, pero cuando pido mostrar el fichero no sale la coma para separar los registro.
#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");
exit(1);
}
}
do{
printf("\nMENÚ\n----\n");
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");
exit(2);
}
break;
case '2': cambiar_salto_por_coma(pf);
break;
case '3': mostrar_fich(pf);
break;
} //switch
}while(op!='0');
if(fclose(pf) == EOF)
printf("Error al cerrar el fichero.\n");
exit(0);
}//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");
exit(4);
}
/* 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);
printf("Deuda: "); scanf("%lf", &cli.deuda);
/*Escribe el cliente en el fichero */
fwrite(&cli, sizeof(struct cliente), 1, pf);
printf("¿Otro? (s/n) ");
LEE_CHAR(otro);
}while((otro=='s') || (otro=='S'));
if(fclose(pf) == EOF){
printf("Error al cerrar el fichero, compruebe si hay información.\n");
exit(5);
}
} /* 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=',';
}
printf("%c",letra);
letra = getc(pf);
}
// Cerrar fichero
fclose(pf);
getchar();
return 0;
}
}
//////////////////////////////////
void mostrar_fich(FILE *pf){
char letra;
struct cliente cli;
rewind(pf);
fread(&cli,sizeof(struct cliente),1,pf);
while(!feof(pf)){
printf("%s %s %.2lf\t\n\n",cli.nombre,cli.direccion,cli.deuda);
fread(&cli,sizeof(struct cliente),1,pf);
}
}