Foros del Web » Programación para mayores de 30 ;) » C/C++ »

error porgramando un partidor de archivos

Estas en el tema de error porgramando un partidor de archivos en el foro de C/C++ en Foros del Web. Hola, estoy creando un programa para dividir archivos, tipo winrar, pero me he atascado con un error de ejecuccion. a ver si alguien me puede ...
  #1 (permalink)  
Antiguo 04/04/2011, 01:25
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
error porgramando un partidor de archivos

Hola, estoy creando un programa para dividir archivos, tipo winrar, pero me he atascado con un error de ejecuccion. a ver si alguien me puede ayudar.

al principio, he creado la matriz de ficheros asi: FILE f2[10]; y funcionaba bien. pero despues he decidido hacerlo con memoria dinamica, usando realloc, pero ahi ya me ha dado problemas.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5.  
  6. int main()
  7. {
  8.        FILE *f1, *f2, *f3;
  9.        char buffer[10000], name[100]="/home/.../Escritorio/.../salida.000";
  10.        char nombre[100];
  11.        int leidos=0, tamano=0, kbparte = 0, nfiles=0, i=0, j=0, pos=0, g=49;
  12.        
  13.        printf("Nombre del archivo: ");
  14.        scanf("%s", nombre);      
  15.        fflush(stdin);
  16.    
  17.        
  18.        f1 = fopen(nombre, "rb");
  19.        if (f1==NULL)
  20.        {
  21.              perror(nombre);
  22.              return -1;
  23.        }
  24.        
  25.        fseek(f1, 0, SEEK_END);
  26.        tamano = ftell(f1);
  27.        fseek(f1, 0, SEEK_SET);
  28.        printf("Tamano: %d bytes\n\n", tamano);
  29.        printf("\nBytes por parte: ");
  30.        scanf("%d", &kbparte);
  31.        fflush(stdin);    
  32.            
  33.        
  34.        leidos = fread(buffer, kbparte, 1, f1);
  35.        if(leidos == 0)
  36.        {
  37.           printf("no se ha leido ningun byte");
  38.           return -1;
  39.        }  
  40.        if(leidos == -1)
  41.        {
  42.           printf("Error!");
  43.           return -1;  
  44.         }  
  45.        
  46.        
  47.  
  48.        
  49.         while(leidos != 0)
  50.         {
  51.                f2 = (FILE *)realloc(f2, nfiles*sizeof(struct FILE *) + sizeof(struct FILE *));
  52.                if(f2==NULL)
  53.                {
  54.                     printf("error REALLOC\n\n");
  55.                     return -1;
  56.                    
  57.                }
  58.                
  59.                nfiles++;
  60.                
  61.                f2 = fopen(name, "wb");
  62.                if (f2==NULL)
  63.                {
  64.                       perror("No se puede abrir salida.txt");
  65.                       return -1;
  66.                }
  67.                
  68.                fwrite(buffer, kbparte, leidos, f2);
  69.                
  70.                buffer[0]='0';
  71.                leidos = fread(buffer, kbparte, 1, f1);
  72.                
  73.                if(leidos == -1)
  74.                {
  75.                      printf("\nError!\n\n");
  76.                      return -1;  
  77.                }
  78.                
  79.              
  80.                pos=strlen(name)-1;
  81.                name[pos] = g;
  82.                g++;
  83.                //i++;
  84.                f2++;
  85.                
  86.         }
  87.        
  88.         printf("\nLeidos: %d bytes. \n\n", leidos);
  89.         fclose(f2);
  90.      
  91.         free(f2);
  92.         fclose(f1);  
  93.         return 0;
  94.              
  95. }

lo mas seguro es que el error este en la linea del REALLOC

ERROR:

Código:
Nombre del archivo: archivo1.dat
Tamano: 53 bytes


Bytes por parte: 10
*** glibc detected *** ./prog: realloc(): invalid pointer: 0x085a9214 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x46b591]
/lib/tls/i686/cmov/libc.so.6(realloc+0x2bb)[0x47117b]
./prog[0x8048a04]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x416bd6]
./prog[0x80486f1]
======= Memory map: ========
00214000-00231000 r-xp 00000000 08:03 2654291    /lib/libgcc_s.so.1
00231000-00232000 r--p 0001c000 08:03 2654291    /lib/libgcc_s.so.1
00232000-00233000 rw-p 0001d000 08:03 2654291    /lib/libgcc_s.so.1
00400000-00553000 r-xp 00000000 08:03 2679452    /lib/tls/i686/cmov/libc-2.11.1.so
00553000-00554000 ---p 00153000 08:03 2679452    /lib/tls/i686/cmov/libc-2.11.1.so
00554000-00556000 r--p 00153000 08:03 2679452    /lib/tls/i686/cmov/libc-2.11.1.so
00556000-00557000 rw-p 00155000 08:03 2679452    /lib/tls/i686/cmov/libc-2.11.1.so
00557000-0055a000 rw-p 00000000 00:00 0 
005f1000-0060c000 r-xp 00000000 08:03 2654853    /lib/ld-2.11.1.so
0060c000-0060d000 r--p 0001a000 08:03 2654853    /lib/ld-2.11.1.so
0060d000-0060e000 rw-p 0001b000 08:03 2654853    /lib/ld-2.11.1.so
006b5000-006b6000 r-xp 00000000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 08:03 3851841    /home/.../Escritorio/.../prog
08049000-0804a000 r--p 00000000 08:03 3851841    /home/.../Escritorio/.../prog
0804a000-0804b000 rw-p 00001000 08:03 3851841    /home/.../Escritorio/.../prog
085a9000-085ca000 rw-p 00000000 00:00 0          [heap]
b7819000-b781a000 rw-p 00000000 00:00 0 
b782d000-b7833000 rw-p 00000000 00:00 0 
bf88e000-bf8a3000 rw-p 00000000 00:00 0          [stack]
Cancelado
  #2 (permalink)  
Antiguo 04/04/2011, 10:29
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años
Puntos: 228
Respuesta: error porgramando un partidor de archivos

Para hacer un realloc primero debes allocar memoria. Osea tienes que empezar con memoria inicial haciendo un malloc, como minimo.
  #3 (permalink)  
Antiguo 04/04/2011, 15:58
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 9 meses
Puntos: 4
Respuesta: error porgramando un partidor de archivos

No, realloc sirve tambien como malloc.

ya he encontrado la solucion:

FILE *f1, **f2;
...
*f2 = (FILE *)realloc(f2, nfiles*sizeof(struct FILE *) + sizeof(struct FILE *));

hay que hacer una matriz de punteros a estructuras FILE, y yo estaba haciendo una matriz de estructuras FILE.

de todos modos no hace falta hacer lo que yo estaba haciendo. con un archivo f2 es suficiente, simplemente lo habres y lo cierras.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:36.