Normas del foro
Bienvenido(a),
Visitante
. Favor de
ingresar
o
registrarse
.
¿Perdiste tu
email de activación?
- Diciembre 03, 2008, 02:59:35
Visita:
Articulos
-
Juegos Gratis
-
Da Foros
Comunidad Underground Hispana
|
Programacion
|
Programación
|
Carbide C/C#/C++
(Moderador:
Fashion
) | Tema:
Leer archivo en binario y partirlo
0 Usuarios y 1 Visitante están viendo este tema.
« anterior
próximo »
Páginas:
[
1
]
Autor
Tema: Leer archivo en binario y partirlo (Leído 389 veces)
-Erick-
Gran Colaborador
Desconectado
Mensajes: 1500
Leer archivo en binario y partirlo
«
en:
Enero 07, 2008, 08: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, 08:03:23 por -Erick-
»
En línea
dreams_eater
Habitual
Desconectado
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #1 en:
Enero 07, 2008, 09: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-
Gran Colaborador
Desconectado
Mensajes: 1500
Re: Leer archivo en binario y partirlo
«
Respuesta #2 en:
Enero 07, 2008, 10: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, 10:14:38 por -Erick-
»
En línea
dreams_eater
Habitual
Desconectado
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #3 en:
Enero 07, 2008, 10: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
Mensajes: 1362
Ni0-inside the source code
Re: Leer archivo en binario y partirlo
«
Respuesta #4 en:
Enero 07, 2008, 12: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
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
Linux Registred User #460377
-Erick-
Gran Colaborador
Desconectado
Mensajes: 1500
Re: Leer archivo en binario y partirlo
«
Respuesta #5 en:
Enero 07, 2008, 12: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, 12:50:25 por -Erick-
»
En línea
Ni0
Gran Colaborador
Desconectado
Mensajes: 1362
Ni0-inside the source code
Re: Leer archivo en binario y partirlo
«
Respuesta #6 en:
Enero 07, 2008, 05: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
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
Linux Registred User #460377
dreams_eater
Habitual
Desconectado
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #7 en:
Enero 08, 2008, 06:41:39 »
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, 09: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
Mensajes: 194
Re: Leer archivo en binario y partirlo
«
Respuesta #8 en:
Enero 08, 2008, 09: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-
Gran Colaborador
Desconectado
Mensajes: 1500
Re: Leer archivo en binario y partirlo
«
Respuesta #9 en:
Enero 08, 2008, 11: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
Bueno si puedo mañana lo pruebo.
Saludos
«
Última modificación: Enero 08, 2008, 11:33:19 por -Erick-
»
En línea
dreams_eater
Habitual
Desconectado
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #10 en:
Enero 08, 2008, 11: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
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
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
Mensajes: 194
Re: Leer archivo en binario y partirlo
«
Respuesta #11 en:
Enero 08, 2008, 02:06:10 »
Buenas
Cita de: dreams_eater en Enero 08, 2008, 11:52:51
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
Cita de: dreams_eater en Enero 08, 2008, 11:52:51
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.
Cita de: dreams_eater en Enero 08, 2008, 11:52:51
(espero que no estes pensando cargar el archivo a memoria)
No
Cita de: dreams_eater en Enero 08, 2008, 11:52:51
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
Cita de: dreams_eater en Enero 08, 2008, 11:52:51
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
Mensajes: 1362
Ni0-inside the source code
Re: Leer archivo en binario y partirlo
«
Respuesta #12 en:
Enero 08, 2008, 04: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
Necesitas ser usuario para ver los enlaces
Crear Usuario
Hacer Sesion
Linux Registred User #460377
dreams_eater
Habitual
Desconectado
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #13 en:
Enero 08, 2008, 09: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
Mensajes: 194
Re: Leer archivo en binario y partirlo
«
Respuesta #14 en:
Enero 08, 2008, 10: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
Mensajes: 184
Re: Leer archivo en binario y partirlo
«
Respuesta #15 en:
Enero 09, 2008, 07: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
Mensajes: 194
Re: Leer archivo en binario y partirlo
«
Respuesta #16 en:
Enero 11, 2008, 10:46:26 »
Cita de: dreams_eater en Enero 09, 2008, 07: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).
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
]
Comunidad Underground Hispana
|
Programacion
|
Programación
|
Carbide C/C#/C++
(Moderador:
Fashion
) | Tema:
Leer archivo en binario y partirlo
« anterior
próximo »
Ir a:
Por favor selecciona un destino:
-----------------------------
Foros De Consulta General
-----------------------------
=> Novedades
=> Dudas, Comentarios Y Sugerencias
=> Top 100
=> Off-Topic
=> Revista E-Zine
===> Noticias
-----------------------------
Phreaking, Hacking y Seguridad
-----------------------------
=> HacK GeneraL
===> Ingenieria Inversa
===> Encriptacion, Cryptografia
===> TV HACK
===> Cursos y Ezines
=====> Trucos Internet
=====> Textos Hacking
===> Defacing
=> Seguridad
=> Phreaking
===> Moviles
=> Bug y Exploits
===> Directorio de Exploits
=> Wargames, Retos Hack
-----------------------------
Hack Novato
-----------------------------
=> Hack para newbies
=> Todo Messenger
=> Troyanos y virus
-----------------------------
Sistemas Operativos
-----------------------------
=> Windows y otros sistemas operativos no libres
===> Problemas Tecnicos Windows
=> Sistemas operativos libres.
===> GNU/Linux
===> Manuales y Tutoriales
===> Descargas
-----------------------------
Programacion
-----------------------------
=> Programación
===> Programación Basica
===> Otros Lenguajes
===> Visual Basic y Net
===> ASM
===> Programacion Shell
===> Perl
===> Carbide C/C#/C++
===> Batch
===> SQL
=> Programacion para webmasters
===> Consultas Generales
===> Php
===> Html, XHTML, CSS
===> Java - Java Script
===> CMS O Scripts Pre-Fabricados
===> Posicionamiento en buscadores
-----------------------------
Artes Graficas
-----------------------------
=> Diseño Grafico
===> Battle Arts
===> Flash
===> Tutoriales
===> Galerías
===> Software
-----------------------------
Area Tecnica
-----------------------------
=> Networking & Wireless
=> Overclocking, Refrigeracion y demas
=> Hardware
===> Biblioteca Tecnica
=> Electronica Y Robotica
-----------------------------
Programas
-----------------------------
=> Software
===> Configuraciones de software
===> Pedidos de software
=> Cracks & Serialz
=> P2p, Bittorrent, Elinks
-----------------------------
Multimedia Y Divx
-----------------------------
=> Juegos PC Y Consolas
===> Dudas ayudas y comentarios de juegos
===> Pedidos de juegos
===> Juegos de Consola
=> Mp3
=> Multimedia
=> Peliculas Divx
-----------------------------
Entretenimiento Y sitios de interes
-----------------------------
=> Juegos, Humor y Adultos. (Diversión)
===> Adultos
=> Paginas Webs Recomendadas
=> Videos
Powered by SMF 1.1.7
|
SMF © 2006-2007, Simple Machines LLC
Loading...