Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse.
¿Perdiste tu email de activación? - Agosto 21, 2008, 03:54:34
Boton Buscar
Inicio Ayuda Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: Leer archivo en binario y partirlo 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: Leer archivo en binario y partirlo  (Leído 258 veces)
-Erick-
Moderación
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1481



Ver Perfil WWW Email
« en: Enero 07, 2008, 09:02:25 »

Buenas soy muy novato en esto,lo que intento hacer es leer un fichero en binario,y partirlo mediante una marca que he puesto.
Osea:
Parte1//Parte2
Partirlo y tener asi dos cadenas.
El caso es que me atasco en lo de partirlo,uso la funcion 'strtoken'pero está parte cadenas y al leer el fichero me lo da en int,tambien he intentado pasandolo a cadena con 'itoa' y nada.
Basicamente es partir el archivo.
Gracias y saludos.
Es en C y uso Dev-C++.
« Última modificación: Enero 07, 2008, 09:03:23 por -Erick- » En línea


dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #1 en: Enero 07, 2008, 10:27:29 »

no se si te equivocaste tipeando creo que se llama strtok()
su prototipo es
char *strtok(char *s1, const char *s2);
Código:
#include <stdio.h>
#include <string.h>

int main()
{
   char s1[49] = "Esto es un ejemplo para usar la funcion strtok()";
   char s2[4] = " ";
   char *ptr;

   printf( "s1=%s\n", s1 );

   ptr = strtok( s1, s2 );    // Primera llamada => Primer token
   printf( "%s\n", ptr );
   while( (ptr = strtok( NULL, s2 )) != NULL )    // Posteriores llamadas
     printf( "%s\n", ptr );

   return 0;
}

Te recomiendo ir tomando minima cantidad posible (hacer un cast si obtienes un int del archivo ) agregarle el caracter nulo al final y haz el strtok.

Probablemente falles por hacer overflow cuando tu cadena no tenga caracter nulo.

En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
-Erick-
Moderación
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1481



Ver Perfil WWW Email
« Respuesta #2 en: Enero 07, 2008, 11:13:40 »

Si es 'strtok',me lié.
Basicamente el problema es asignar lo k leo con:
FILE *fichero;
  fichero=fopen("este.exe","r");
  while(!feof(fichero))
  {
 fgetc(fichero);
    }

A un char para luego:
char *partir;
 partir=strtok(variableChar,"MiMarca");

Y he probado asi:
char c=(char)fgetc(fichero);
Y con 'itoa'.
Saudos.
« Última modificación: Enero 07, 2008, 11:14:38 por -Erick- » En línea


dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #3 en: Enero 07, 2008, 11:50:25 »

por consejo: si no anda con el cast,¿por que va andar con itoa?

mas que partir un exe tu quieres buscar tu marca
no puedes moverte de esa forma.

que tan grande es tu marca?

yo crearia un arreglo de tamaño de mi marca + el caracter nulo.

y me moveria con un lento for incremental

Código:
arreglo[ultimo elemento]='/0';
for (int i=0; (compara con la funcion que mas te agrade el final del archivo);++i){

fseek(fichero,i,SEEK_SET);//vamos a posicionarnos, cada vez un pasito mas adelante
fread(arreglo,sizeof(char),elementos -1,fichero);//grabo pero no toco el ultimo elemento

if(!strcmp(arreglo, marca)break;//acordate que retorna verdadero si son distintos
}
if(...se alcanzo final de archivo...)printf("error");
else{
//estas posicionado despues de tu marca!!
//az lo que quiera aqui
}




En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #4 en: Enero 07, 2008, 01:24:05 »

lo que pasa es que lo queres abrir en formato texto
Citar
FILE *fichero;
  fichero=fopen("este.exe","r");
  while(!feof(fichero))
  {
tenes que abrirlo en forma rb, osea te qeuda
fichero=fopen("este.exe", "rb");
no se si soluciona el problema, pero para archivos binarios tenes que hacerlo asi


otra cosa, podes postear el codigo que tenes echo hasta ahora??

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
-Erick-
Moderación
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1481



Ver Perfil WWW Email
« Respuesta #5 en: Enero 07, 2008, 01:49:20 »

Si es "rb" lo que pasa es que estuve haciendo pruebas con un archivo de texto pork me era mas claro lo de la cadena.
El codigo:
   char *partir;
  FILE *fichero;
  fichero=fopen("este.exe","rb");
  while(!feof(fichero))
  {


      char c=(char)fgetc(fichero);
      partir=strtok(c,"a");
    }

    //printf("%s",partir);
    fclose(fichero);
  system("PAUSE");
  return 0;
}


Está muy mal.
Lo voy modificando para hacer pruebas pero la base es mas o menos la misma si está mal decidmelo.
Gracias y saludos.
« Última modificación: Enero 07, 2008, 01:50:25 por -Erick- » En línea


Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #6 en: Enero 07, 2008, 06:24:39 »

nunk use strtok, asique sobre como usarlo no te puedo decir

loque si te puedo decir es que tenes que crear una cadena, haciendo
char cadena[longitud];
vos no pones ninguna cadena donde guardar lo que lees del archivo, haces char c=fgetc(fichero);
y creo que eso en C esta mal xD; lo pones en la mitad del codigo xD

mezcando tu codigo y lo que puso dreams_eatern hice esto (no lo compile xD)
Código:
#include <stdio.h>
#include <string.h>
main(){
  char *partir;
  FILE *fichero;
  char buff[1000];/*la cadena*/
  int i = 0;
  fichero=fopen("este.exe","rb");
  while(!feof(fichero))
  {
      buff[i]=(char)fgetc(fichero);
      i++;
      if(i == 1000)return 0; /*para que no haya overflow*/
    }
    /*una vez que guardamos todo en buff...*/
    partir=strtok(buff,"a");
    printf("%s",partir);
    fclose(fichero);
  system("PAUSE");
  return 0;
}

tenes que aprender de cadenas, strings, arreglos, o como lo llamen en el tuto xD (quisa tambien lo llaman vactor)

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #7 en: Enero 08, 2008, 07:41:39 »

Sad mmm erik y Ni0 : la marca tiene que ser grande( recomiendo 4 chares minimo) para que no se confunda con instrucciones y otros.
La probabilidad de que salga lo equibocado es alta cuanto mas chico es el arreglo.
Estas comparando una sola vez en los primeros 1000 bytes ni0.
¿ que pasa si estubiese despues de los primeros 1000 bytes?
por razones de velocidad uso strcmp y no strtok, strcmp retornara ante la primera diferencia la resta de los chares que justo estaba comparando (es por eso que retorna 0 en caso de igualdad).

Código:
#include <stdio.h>
#include <string.h>
#define cadena 15//largo de la marca+1, en este caso la marca es de 15 chares
int main(){
  FILE *partir=NULL;//No era un archivo lo que queriamos partir?
  FILE *fichero;
  char comparador[cadena];/*la cadena*/
  char marca[15]="marcas grandes";
  int i = 0;
  comparador[cadena-1]=0;///COMIDO
  fichero=fopen("este.exe","rb");
  while(!feof(fichero)) //quieren while, les dare while, pero igual sera como el for
  {
     fseek(fichero,i,SEEK_SET);
     fread(comparador,sizeof(char),cadena-1,fichero);
     if(!strcmp(comparador,marca)break;
     ++i;  //LO QUE ME COMI
    }
    /*una vez que guardamos todo en buff...*/
    if(feof(fichero)){
      printf("Se alcanzo el final sin encontrar la marca");
      fclose(fichero);
      getrchar();//system no funcionan en todos los compiladores
      return 0; }
   partir=fichero;//ya lo partiste despues de la marca
 //si qures volver lo haces con fseek
//tambien podes crear un nuevo fichero asignarlo a "FILE* fichero", ya que tienes a "FILE* partir" //direccionado a la marca
//y así guardar desde la marca en adelante un fichero
//tantas cosas podes hacer aqui....
  return 0;
}

creo que ya esta....

recomiento trabajar con fread y fwrite con los files.
« Última modificación: Enero 08, 2008, 10:18:21 por dreams_eater » En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #8 en: Enero 08, 2008, 10:58:09 »

No necesariamente una marca tiene que ser tan grande. El NULL es una marca y es un 0. El nueva linea es una marca y tambien es un caracter.

fichero=fopen("este.exe","rb");
Si el archivo no existe, o no se pudo abrir, no podes hacer operaciones como feof sobre el

fseek(fichero,i,SEEK_SET);
En esto estoy medio oxidado por decirlo de alguna manera, pero hacer esto en el while, no haria que estes leyendo continuamente la primera parte del archivo?

fread(comparador,sizeof(char),cadena-1,fichero);
if(!strcmp(comparador,marca)break;

No se si fread agrega el '\0' a el arreglo, por lo que tampoco podrias usar strcmp, ya que esta funcion compara hasta encontrar la marca '\0'. Podrias usar strncmp que compara hasta los primeros N caracteres. Tambien lo que podrias hacer es inicializar comparador en 0 y como siempre sobre-escribis cadena - 1 posiciones de comparador, la ultima posicion siempre va a quedar en 0

-Erick-, realmente no entiendo muy bien lo que queres hacer... vos lo que queres es hacer de 1 archivo dos archivos? O cada "registro" dividirlo por una marca?


Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

-Erick-
Moderación
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1481



Ver Perfil WWW Email
« Respuesta #9 en: Enero 08, 2008, 12:32:00 »

Bueno primero muchas gracias a todos.Si tengo tiempo pruebo lo k deciis que ahora no puedo porque tengo que estudiar,solo pasaba.
Y para freakmind,si,osea tengo un archivo digamos que hay 2 archivos metidos separados por una marca,y quiero separarlos.
Osea:
[Archivo1]+[Archivo2]= [Archivo1#Archivo2]
Y ahora quiero separarlos.
Los [] son archivos  Tongue
Bueno si puedo mañana lo pruebo.
Saludos Wink
« Última modificación: Enero 08, 2008, 12:33:19 por -Erick- » En línea


dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #10 en: Enero 08, 2008, 12:52:51 »

todo el tiempo estubimos hablando de abrir un .exe
cada unstruccion lo leera como como caracter , hay miles de instruciones
de la 0h a la 0ffffffh (o más) creo que estan todas con un queaser.

si tu quieres buscar una letra te garantizo que lo que allaste es una insteruccion y no tu letra querida.
una marca de 14 caracteres me garantiza una probavilidad muuy baja de error.

Con respecto a
Cita de: amigo freak
pero hacer esto en el while, no haria que estes leyendo continuamente la primera parte del archivo?
esta el i, que dara un pasito y abanzara (hasta llegar al fin o aver encontrado la palabra).

(espero que no estes pensando cargar el archivo a memoria)

fread no pone cero, copia la cantidad que le ordenas como strncpy

lo autentico, seria pensar en el formato del archivo, conosiendolo, sera más facil buscar la maldita marca.
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #11 en: Enero 08, 2008, 03:06:10 »

Buenas

si tu quieres buscar una letra te garantizo que lo que allaste es una insteruccion y no tu letra querida.
Yo no dije que busque una letra, sino una marca. Una marca como yo lo entiendo, es tal porque es unica. El EOF es una marca (sea .exe o lo que sea) y no son 14 caracteres
esta el i, que dara un pasito y abanzara (hasta llegar al fin o aver encontrado la palabra).
Yo al menos no veo donde modificas i para que de ese pasito.

(espero que no estes pensando cargar el archivo a memoria)
No

fread no pone cero, copia la cantidad que le ordenas
No dije que fread pusiera cero. Dije que para usar strcmp debes tener un '\0' en el arreglo. Lo que dije es que inicializaras el vector en 0. Si tenes 15 posiciones en 0 y siempre modificas 14, la ultima posicion siempre queda en 0

lo autentico, seria pensar en el formato del archivo, conosiendolo, sera más facil buscar la maldita marca.
Excepto que tengas una forma de indexar el archivo, no es posible hacer otra cosa que una busqueda secuencial

Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

Ni0
Gran Colaborador
*****
Desconectado Desconectado

Mensajes: 1362


Ni0-inside the source code

Ni0@el-hacker.org
Ver Perfil WWW Email
« Respuesta #12 en: Enero 08, 2008, 05:42:31 »

aver... defendiendo mi codigo...... xD
ahora hice otro, seguria existiendo el problema de la marca, de que es probable que ya este en el archivo, blablabla. hice uno que divida a el archivo main.c (el nombre del archivo del codigo que voy a postear), osea, divido al codigo en 2, la marca es whi, osea, cuando encuentra un whi lo divide y lo pone en otro archivo, pero whi no lo pone en el otro archivo, porque si es una marca distintiva no tiene que estar en ninguno de los 2 archivos xD.
Código:
#include <stdio.h>
#define MARCA 'w'
#define MARCA2 'h'
#define MARCA3 'i'
main()
{
    FILE *f;
    FILE *p1[2];
    int i = 0;
    int c[3];
    int FLAG = 0;
    f = fopen("main.c", "r");
    if(f == NULL)
        return;
    p1[0] = fopen("mainp1.txt", "w");
    p1[1] = fopen("mainp2.txt", "w");
    while(!feof(f)){
        c[0] = fgetc(f);
        if(FLAG == 0){
            c[1] = fgetc(f);
            c[2] = fgetc(f);
            if(c[0] == MARCA && c[1] == MARCA2 && c[2] == MARCA3){
                i++;
                FLAG = 1;
                continue;
            }
        }
        fputc(c[0], p1[i]);
        if(FLAG == 0){
            fputc(c[1], p1[i]);
            fputc(c[2], p1[i]);
        }
    }
    fclose(f);
    fclose(p1[0]);
    fclose(p1[1]);
    getchar();
}
   

salu2!
En línea

Inside The Source Code



Linux Registred User #460377
dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #13 en: Enero 08, 2008, 10:16:57 »

Cita de: ҒrεακΜιи∂
El EOF es una marca (sea .exe o lo que sea) y no son 14 caracteres
mmm, metiste el dedo en la yaga de mis libros, no comosco ese estandar
Cita de: ҒrεακΜιи∂
Yo al menos no veo donde modificas i para que de ese pasito.
ya edite mi code perdón
Citar
Lo que dije es que inicializaras el vector en 0. Si tenes 15 posiciones en 0 y siempre modificas 14, la ultima posicion siempre queda en 0
edite mi code, sobre ese elemento ultimo

Citar
Excepto que tengas una forma de indexar el archivo,
explica mejor ese punto (se que es indexar, pero la unica estructura es una estructura al lado de la otra, es un archivo no el heap)
En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #14 en: Enero 08, 2008, 11:25:41 »

A lo que me refiero es que tengas una forma de realizar una busqueda directa en el archivo, o al menos binaria.

Busqueda directa: el archivo tiene N registros ordenados por un campo, y no existen "saltos" entre valores.
   Ej: Tenes un kiosko y le das a los productos un id que empieza en 1. En un archivo tenes TODOS los productos ordenados por id (a saltos me refiero a que no puede venir 1, 2, 4 ,5 ... ). De esta forma podes hacer fseek(f, id - 1, SEEK_SET); y te dara el producto sin tener que buscarlo secuencialmente

Busqueda binaria: Parecido al anterior. Tenes un archivo de N registros que esta ordenado por un campo, pero esta vez si existen saltos entre los valores de el campo. Entonces lo que tenes que hacer es ir aproximandote. Como sabes que estan ordenados, vas al medio del archivo. Si el producto que buscas es menos al del medio, buscas en la parte de arriba, sino, en la de abajo y asi sucesivamente.


Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

dreams_eater
Habitual
*****
Desconectado Desconectado

Mensajes: 174



Ver Perfil
« Respuesta #15 en: Enero 09, 2008, 08:43:27 »

He hecho cosas parecidas(materias de la facu) pero en memoria.
supongo que son realizables en el archivo.

Interesantes los temas pero tendriamos que crear un topic nuevo y gastar mucho tiempo (que no lo hare).

En línea



"La juventud envejece, la inmadurez se supera, la ignorancia puede educarse, y la borrachera desperjarse, pero la estupidez dura para siempre" - Aristófanes
FreakMind
Habitual
*****
Desconectado Desconectado

Mensajes: 181



Ver Perfil
« Respuesta #16 en: Enero 11, 2008, 11:46:26 »

He hecho cosas parecidas(materias de la facu) pero en memoria.
supongo que son realizables en el archivo.

Interesantes los temas pero tendriamos que crear un topic nuevo y gastar mucho tiempo (que no lo hare).
Obviamente que si. Es una caracteristica de los hd (eso  tambien seguro lo viste en materias de la facu) que les permite buscar en el disco lo que se necesita sin tener que leer todo el contenido (aunque no es completamente directa, sino que tiene que leer ciertas cositas)

Salu2, FreakMind
En línea

Connoisseurs of C semantics find C++ inferior to ++C

Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Carbide C/C#/C++  |  Tema: Leer archivo en binario y partirlo « anterior próximo »
Ir a:  


Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC