Título: sustiyuir el salto de linea por coma
Publicado por: minette1988 en 6 Junio 2010, 21:34 pm
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: "); if((pf = fopen("datos.dat", "rb")) == NULL ) { printf("Error al abrir el fichero.\n"); } else{ while(caracter != EOF){ } printf("Error de lectura.\n"); } } return(0); }
Título: Re: sustiyuir el salto de linea por coma
Publicado por: Zzombi en 7 Junio 2010, 00:41 am
emm y si le pones un poquito de C++ :P? y usas el método replace
Título: Re: sustiyuir el salto de linea por coma
Publicado por: b10s_0v3rr1d3 en 7 Junio 2010, 00:49 am
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]"
Título: Re: sustiyuir el salto de linea por coma
Publicado por: minette1988 en 7 Junio 2010, 11:51 am
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{ while ( !feof(pf ) ) // Mientras no sea final de fichero { printf("%c",letra ); // Muestra el caracter leido } // Cerrar fichero 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.
Título: Re: sustiyuir el salto de linea por coma
Publicado por: b10s_0v3rr1d3 en 8 Junio 2010, 00:16 am
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.
Título: Re: sustiyuir el salto de linea por coma
Publicado por: nicolas_cof en 8 Junio 2010, 02:54 am
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.
Título: Re: sustiyuir el salto de linea por coma
Publicado por: minette1988 en 8 Junio 2010, 14:42 pm
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"); } } 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){ char letra; 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 ); } }
|