elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  sustiyuir el salto de linea por coma
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: sustiyuir el salto de linea por coma  (Leído 5,203 veces)
minette1988

Desconectado Desconectado

Mensajes: 53


Ver Perfil
sustiyuir el salto de linea por coma
« 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.

Código
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.         char nom_fich[50];
  5.         char caracter;
  6.         FILE *pf;
  7.  
  8.         printf("Introduzca nombre del fichero: ");
  9.         scanf("%49s", nom_fich);
  10.  
  11.         if((pf = fopen("datos.dat", "rb")) == NULL) {
  12. printf("Error al abrir el fichero.\n");
  13.         }
  14.         else{
  15.             caracter = getc(pf);
  16.             while(caracter != EOF){
  17.                printf("%c", caracter);
  18.                caracter = getc(pf);
  19.             }
  20.             if(feof(pf)==0){
  21.               printf("Error de lectura.\n");
  22.             }
  23.             fclose(pf);
  24.         }
  25.         return(0);
  26. }


En línea

Zzombi

Desconectado Desconectado

Mensajes: 174



Ver Perfil WWW
Re: sustiyuir el salto de linea por coma
« Respuesta #1 en: 7 Junio 2010, 00:41 am »

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


En línea

shug0

Desconectado Desconectado

Mensajes: 185

si puede hacerse debe hacerse


Ver Perfil WWW
Re: sustiyuir el salto de linea por coma
« Respuesta #2 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]"
En línea

minette1988

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: sustiyuir el salto de linea por coma
« Respuesta #3 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:

Código
  1. #include <stdio.h>
  2. int main()
  3. {
  4.  FILE  *pf;
  5.  char letra;
  6.  
  7.  // Abro el fichero
  8.  pf = fopen("datos.dat","rb");
  9.  
  10.  // Si ha dado fallado termino
  11.  if ( pf == NULL )
  12.     {
  13.     printf("Error al abrir el fichero.");
  14.     return 1;
  15.     }
  16.  else{
  17.  letra = getc(pf);
  18.  while ( !feof(pf) ) // Mientras no sea final de fichero
  19.     {
  20.     printf("%c",letra);    // Muestra el caracter leido
  21.     letra = getc(pf);
  22.     }
  23.  
  24.   // Cerrar fichero
  25.  fclose(pf);
  26.  getchar();
  27.  return 0;
  28.  }
  29. }
  30.  

Ahora cómo hago para decirle que cuando encuentre un salto de linea me lo sustituya por una coma porque no tengo mucha idea.
En línea

shug0

Desconectado Desconectado

Mensajes: 185

si puede hacerse debe hacerse


Ver Perfil WWW
Re: sustiyuir el salto de linea por coma
« Respuesta #4 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.
En línea

nicolas_cof


Desconectado Desconectado

Mensajes: 348


Into the Wild


Ver Perfil WWW
Re: sustiyuir el salto de linea por coma
« Respuesta #5 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...

Código:
#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.
En línea

minette1988

Desconectado Desconectado

Mensajes: 53


Ver Perfil
Re: sustiyuir el salto de linea por coma
« Respuesta #6 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.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define LEE_CHAR(c)\
  6. c=getchar();\
  7. while((c=='\n') || (c==' ') || (c=='\t'))\
  8. c=getchar();
  9.  
  10. #define LEE_CAD(c,n) { int i=0; \
  11.                      c[i]=getchar();\
  12.     while((c[i]=='\n') || (c[i]=='\t')) c[i]=getchar();\
  13.     while ((c[i]!='\n') && (i < (n-1))){ \
  14.        i++;\
  15. c[i]=getchar(); }\
  16.     c[i]='\0'; }
  17.  
  18. #define TAM_NOMBRE 100
  19. #define TAM_DIR 100
  20.  
  21. struct cliente{
  22. char nombre[TAM_NOMBRE];
  23. char direccion[TAM_DIR];
  24.        double deuda;
  25. };
  26. int main(){
  27. void crear_fich();
  28.        int cambiar_salto_por_coma();
  29.        void mostrar_fich();
  30.        char op;
  31. FILE *pf; //Puntero a fichero
  32.  
  33.        /* Abre el fichero para trabajar con él en Lectura / Escritura */
  34.        if((pf = fopen("datos.dat", "wb+")) == NULL) {
  35.           /* Si no existe, ejecuta el módulo que lo cree */
  36.   crear_fich();
  37.   /* Una vez creado lo habre en lectura/escritura */
  38.           if((pf = fopen("datos.dat", "rb+")) == NULL) {
  39. perror("Fichero no accesible");
  40.                exit(1);
  41.   }
  42.        }
  43.  
  44. do{
  45. printf("\nMENÚ\n----\n");
  46. printf("1). Crear fichero.\n");
  47.                printf("2). Cambiar salto de linea por coma.\n");
  48.                printf("3). Mostrar fichero.\n");
  49. printf("0). Salir\n\nOpción(0-3): ");
  50. do{
  51. LEE_CHAR(op);
  52. }while( (op <'0') || (op >'3') );
  53.  
  54. switch(op){
  55. case '1':
  56. crear_fich(pf);
  57.    /* Una vez creado lo abre en lectura/escritura */
  58.    if((pf = fopen("datos.dat", "rb+")) == NULL) {
  59. perror("Fichero no accesible");
  60.                 exit(2);
  61.    }
  62. break;
  63.                                case '2': cambiar_salto_por_coma(pf);
  64.                                        break;
  65.                                case '3': mostrar_fich(pf);
  66.                                        break;
  67. } //switch
  68.        }while(op!='0');
  69. if(fclose(pf) == EOF)
  70.           printf("Error al cerrar el fichero.\n");
  71.        exit(0);
  72. }//main()
  73. ////////////////////////////////////////////////////////////////////////
  74. void crear_fich(FILE* pf) {
  75.         struct cliente cli;
  76.         char otro;
  77.  
  78. if((pf = fopen("datos.dat", "wb")) == NULL) {
  79. perror("Al crear el fichero de datos");
  80.                exit(4);
  81.         }
  82.  
  83.         /* Lectura de los ciclistas */
  84.         do {
  85.  
  86. cli.deuda = 0.0;
  87.                printf("Nombre: "); LEE_CAD(cli.nombre, TAM_NOMBRE);
  88.                printf("Dirección: "); LEE_CAD(cli.direccion, TAM_DIR);
  89.                printf("Deuda: "); scanf("%lf", &cli.deuda);
  90.                /*Escribe el cliente en el fichero */
  91.                fwrite(&cli, sizeof(struct cliente), 1, pf);
  92. printf("¿Otro? (s/n) ");
  93.                LEE_CHAR(otro);
  94. }while((otro=='s') || (otro=='S'));
  95. if(fclose(pf) == EOF){
  96. printf("Error al cerrar el fichero, compruebe si hay información.\n");
  97.                exit(5);
  98.        }
  99. } /* crear_fich()*/
  100. ///////////////////////////////
  101. int cambiar_salto_por_coma(FILE *pf){
  102.  
  103.  char letra;
  104.  
  105.  // Abro el fichero
  106.  if((pf=fopen("datos.dat","rb+"))==NULL){
  107.      printf("Error al abrir el fichero.\n");
  108.      return 1;
  109.  }
  110.  else{
  111.     while ( !feof(pf) ){ // Mientras no sea final de fichero
  112.     if(letra=='\n'){
  113.        letra=',';
  114.     }
  115.     printf("%c",letra);  
  116.     letra = getc(pf);
  117.    }
  118.  // Cerrar fichero
  119.  fclose(pf);
  120.  getchar();
  121.  return 0;
  122.  }
  123. }
  124. //////////////////////////////////
  125. void mostrar_fich(FILE *pf){
  126.       char letra;
  127.       struct cliente cli;
  128.       rewind(pf);
  129.       fread(&cli,sizeof(struct cliente),1,pf);
  130.       while(!feof(pf)){
  131.          printf("%s %s %.2lf\t\n\n",cli.nombre,cli.direccion,cli.deuda);
  132.          fread(&cli,sizeof(struct cliente),1,pf);
  133.      }
  134. }
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Salto de línea (fasm16) y algo mas je
ASM
S3kh 5 6,648 Último mensaje 24 Agosto 2011, 23:51 pm
por S3kh
Problema con nextLine(), como evitar salto de linea
Java
razler 5 21,457 Último mensaje 1 Septiembre 2011, 05:22 am
por razler
Codigo para el salto de linea en BATCH
Scripting
Meine programmen 3 31,116 Último mensaje 3 Enero 2012, 05:14 am
por Eleкtro
salto de Linea en un JtextPane
Programación General
System23 0 4,415 Último mensaje 26 Marzo 2012, 19:23 pm
por System23
coma en division en c
Programación C/C++
lucas59 1 2,184 Último mensaje 1 Octubre 2014, 07:59 am
por BlackM4ster
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines