sustiyuir el salto de linea por coma

Iniciado por minette1988, 6 Junio 2010, 21:34 PM

0 Miembros y 1 Visitante están viendo este tema.

minette1988

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);
}

Zzombi

emm y si le pones un poquito de C++  :P? y usas el método replace

b10s_0v3rr1d3

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]"

minette1988

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.

b10s_0v3rr1d3


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.

nicolas_cof

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.

minette1988

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);
      }
}