![Pensando](http://static.forosdelweb.com/fdwtheme/images/smilies/scratchchin.gif)
![Adios](http://static.forosdelweb.com/fdwtheme/images/smilies/adios.gif)
| |||
Con C (no me quedó claro si estabas usando los filestreams): Para leer archivos lo que tienes que hacer es siempre leerlos en modo _binario_ y byte a byte copiándolos a un buffer, y luego ya operas con él. En vez de "t" usa "b". Y para leer, fread, que te permite meter en un buffer el contenido que desees de un archivo de una tacada, que puede ser todo. Y con C++ lo mismo pero, al igual que en con fopen de C, debes abrir los archivos en modo binario. |
| ||||
si, estoy usando la libreria <fstream> pero eso de abrirlo en modo binario ya lo hice, pero al mostrar el buffer por pantalla no me sale nada, lo que quiero es saber como interpretar lo que leo, yo mas o menos se los datos que necesito sacar pero no se exactamente en que parte del archivo estan :( |
| ||||
Jejeje, pues que quieres que te salga. "este es parte de un juego, aqui se gardan las vidas". Obiamente no, te van salir puros caracteres raros como en el notepad, si lo lees en binario es lo smismo que leerlo ent exto a expcion de que en el binario no se cuentan los saltos de lineas como saltos de lineas, sino como un byte mas del archivo. Lo que debes hacer es buscar en internet o donde sea, las especificaciones de ese archivo, que significa cada byte, o que para que sirve cierto bloque de bytes, etc. Saludos |
| |||
Cita: No, el modo texto lo único diferente que tiene es que el archivo termina al encontrar un EOF o Feedback.
Iniciado por Instru Jejeje, pues que quieres que te salga. "este es parte de un juego, aqui se gardan las vidas". Obiamente no, te van salir puros caracteres raros como en el notepad, si lo lees en binario es lo smismo que leerlo ent exto a expcion de que en el binario no se cuentan los saltos de lineas como saltos de lineas, sino como un byte mas del archivo. Lo que debes hacer es buscar en internet o donde sea, las especificaciones de ese archivo, que significa cada byte, o que para que sirve cierto bloque de bytes, etc. Saludos Los bytes son los mismos, un salto de línea en un archivo será lo mismo que en uno binario. Y sobre lo de investigar acerca del archivo, deberias abrirle con un editor hexadecimal (o hacerle tú) y intentar identificar algo en él.. Si es muy complicado olvídalo porque podrías tirarte horas. Algunas ideas: buscas patrones; grabas el archivo con un valor conocido, luego lo buscas en el archivo grabado, vuelves a probar, si coincide ahí tendrás los bytes que buscabas. Para los juegos comerciales o parecidos te será difícil hacer cosas de esas, son archivos muy grandes (les he visto de hasta megas, me parece exagerar) en los que cambian mucho las cosas, aparte de si los encriptan de cualquier manera. Con que te metan un XOR estarías mareado y te sería imposible descifrar nada, así que imagínate... Por otra parte, para hacer cosas de esas en los juegos lo que hago es atacarles en ejecución en la memoria. Es más fácil en la mayoría de los casos que intentar leer el archivo a mano tú solo. Hasta Age Of Empires 2 Conquerors le logré cambiar a 500 el límite de población en ejecución (por lo menos el indicador textual, no sé si el límite real, dado que no llegué a hacer unidades para comprobarlo)... Para esto hay programas ya hechos. Eso, o hacerte un programa, pero debes usar la API y tener cuidado de que no te lo detecten o de colgar el programa al que atacas. También decirte que estos programas suelen hacer virguerías en ejecución para que sea más difícil accederles. |
| ||||
como es eso dele ditor hexadecimal, para que sirve y cual puedo usar?? el archivo que yo quiero leer es un replay del Warcraft 3 y no pesa mas de 120kb como mucho, ya hay programas que se encargan de extraer informacion de este archivo, incluso yo me baje un script en PHP y lo tengo en mi pagina para sacar la info de los replays que envia la gente. lo unico que se me ocurre es investigar el script en php y ver como lo hacen para luego tratar de hacerlo en c++, claro q es mucho mas dificil parece :s |
| |||
Cita: Pues al contrario, si ya está hecho el código será lo más sencillo.
Iniciado por SiR.CARAJ0DIDA como es eso dele ditor hexadecimal, para que sirve y cual puedo usar?? el archivo que yo quiero leer es un replay del Warcraft 3 y no pesa mas de 120kb como mucho, ya hay programas que se encargan de extraer informacion de este archivo, incluso yo me baje un script en PHP y lo tengo en mi pagina para sacar la info de los replays que envia la gente. lo unico que se me ocurre es investigar el script en php y ver como lo hacen para luego tratar de hacerlo en c++, claro q es mucho mas dificil parece :s Un editor hexadecimal es un editor que abre los archivos y muestra sus bytes con distintas funciones para mostrarlo en hexadeciaml, decimal, al lado la cadena, el offset, búsqueda y mil cosas más. |
| ||||
bueno aca hice un mini programita q lee el archivo, pero cuando lo muestro no sale nada, incluso trato de mostrar en hexadecimal y nada..
Código:
#include <iostream> #include <iomanip> #include <fstream> #include <conio.h> #include <stdlib.h> using namespace std; void leer(char*, long); void fileinfo(char**, long*); void mostrar(char*); int main() { char *buffer; long size; fileinfo(&buffer, &size); leer(buffer, size); mostrar(buffer); system("pause"); return 0; } void fileinfo(char **buffer, long *size) { ifstream file("G:\\test.w3g", ios::in | ios::binary | ios::ate); *size = file.tellg(); file.seekg(0, ios::beg); *buffer = new char[*size]; } void leer(char *buffer, long size) { ifstream file("G:\\test.w3g", ios::in | ios::binary); if (!file.fail() && file.is_open()) { file.read(buffer, size); cout << "\nCantidad de caracteres leidos: " << file.gcount() << endl; cout << "\nEl archivo ocupa " << size << " bytes" << endl; }else{ cout << "Error en el archivo.\n\n"; } } void mostrar(char *buffer) { cout << hex << buffer << endl; delete[] buffer; } |
| ||||
Pues esta raro, pero mira no te podria ayudar mucho porque usas C+ y pues yo me especializo en C. Lo que si te puedo decir es que no es muy buena idea hacer eso, namas te lo digo como consejo, no lo tomos a mal. Es mala idea porque lo unico que haces es un mostrador hexadecimal, y si lo que quieres es editarle algo o extraer info del archivo pues namas informate que sgnifica cada byte Saludos |
| |||
Cita: Lo ha hecho porque le dije que usase uno (Ejemplo Hex Workshop) o directamente se hiciese él uno...
Iniciado por Instru Pues esta raro, pero mira no te podria ayudar mucho porque usas C+ y pues yo me especializo en C. Lo que si te puedo decir es que no es muy buena idea hacer eso, namas te lo digo como consejo, no lo tomos a mal. Es mala idea porque lo unico que haces es un mostrador hexadecimal, y si lo que quieres es editarle algo o extraer info del archivo pues namas informate que sgnifica cada byte Saludos PD: Dirás que estás aprendiendo C y aún no has empezado con C++ ;) |
| |||
Cita: Bueno no tengo tiempo de corregirte, pero no cierras el archivo después de usarle, usas variables con puntero extrañas (long*) cuando puedes devolverlo por la función y usas un (char **) que no me explico... Puedes pasar el char* normal a la función, no hace falta hacer putneros a punteros...
Iniciado por SiR.CARAJ0DIDA bueno aca hice un mini programita q lee el archivo, pero cuando lo muestro no sale nada, incluso trato de mostrar en hexadecimal y nada.. |
| ||||
me parece que tenes que repasar punteros.. si yo le mando el puntero le estoy mandando el contenido del puntero, yo necesito la direccion del puntero para alojar ahi la direcion de el nuevo char creado dinamicamente, pruebalo y veras que no funciona como tu dices. con respecto al long*, si no me equivoco el limite del entero sin signo es el 64.000, asi que no me alcanza para alojar el tamaño del archivo.. me baje un tal "editpad pro" o algo asi, abro el archivo y lo muestro en hexadecimal todo muy lindo y prolijito pero no se que significa cada numero :( |
| |||
Cita:
Iniciado por SiR.CARAJ0DIDA me parece que tenes que repasar punteros.. si yo le mando el puntero le estoy mandando el contenido del puntero, yo necesito la direccion del puntero para alojar ahi la direcion de el nuevo char creado dinamicamente, pruebalo y veras que no funciona como tu dices. con respecto al long*, si no me equivoco el limite del entero sin signo es el 64.000, asi que no me alcanza para alojar el tamaño del archivo.. me baje un tal "editpad pro" o algo asi, abro el archivo y lo muestro en hexadecimal todo muy lindo y prolijito pero no se que significa cada numero :( ![]() ![]() ![]() ![]() Para que te des cuenta de las bobadas que dices y que el que tienes que repasar aquí eres tú: Cita: Si yo le mando un XXX le estoy mandando el contenido de XXX. <--- Pues va a ser que no
Iniciado por SiR.CARAJ0DIDA si yo le mando el puntero le estoy mandando el contenido del puntero Si yo le mando una caja le estoy mandando el contenido de la caja. <--- Pues va a ser que no Si yo le mando el puntero le estoy mandando el contenido del puntero. <--- Pues tampoco Lo lamento pero es que me ha dolido ![]() Sobre lo del "puntero a puntero a char" para "modificar el puntero a char", decirte que sigue siendo extraño e inútil, para eso se devuelve el puntero char * ya reservado, y no pasar un **... Así logras programas de locura. Sobre lo de long*, es otra locura, no me parece a mi juicio bien programado. Las funciones, cuantos menos argumentos-modificables tengan mejor. Y si no, usa referencias para lo que intentas hacer que para eso existen y no lías más el programa con punteros... ;) O mejor aún, nada de las dos: ¡Junta las dos funciones y deja de pasar cosas extrañas! Por cierto, lo que te dije es totalmente correcto. Sobre lo del long, no es long sino "unsigned long", y el limite no es 64000 sino 4294967296, y el unsigned short sí son 65536 que es lo que aproximabas. Última edición por MaxExtreme; 15/06/2005 a las 12:51 |
| ||||
Cita: bueno si vos sabes mas que mi profesor de la universidad haceme el programa con un solo puntero como vos decis a ver si anda.
Iniciado por MaxExtreme ![]() ![]() ![]() ![]() Para que te des cuenta de las bobadas que dices y que el que tienes que repasar aquí eres tú: Si yo le mando un XXX le estoy mandando el contenido de XXX. <--- Pues va a ser que no Si yo le mando una caja le estoy mandando el contenido de la caja. <--- Pues va a ser que no Si yo le mando el puntero le estoy mandando el contenido del puntero. <--- Pues tampoco Lo lamento pero es que me ha dolido ![]() Sobre lo del "puntero a puntero a char" para "modificar el puntero a char", decirte que sigue siendo extraño e inútil, para eso se devuelve el puntero char * ya reservado, y no pasar un **... Así logras programas de locura. Sobre lo de long*, es otra locura, no me parece a mi juicio bien programado. Las funciones, cuantos menos argumentos-modificables tengan mejor. Y si no, usa referencias para lo que intentas hacer que para eso existen y no lías más el programa con punteros... ;) O mejor aún, nada de las dos: ¡Junta las dos funciones y deja de pasar cosas extrañas! Por cierto, lo que te dije es totalmente correcto. Sobre lo del long, no es long sino "unsigned long", y el limite no es 64000 sino 4294967296, y el unsigned short sí son 65536 que es lo que aproximabas. 65535 es el limite del INT no del long, estas cambiando todo lo que dije, como se supone que voy a guardar el numero 117734 en un INT?? .. |
| ||||
Esos limites dependen de la arquitectura, el problema es que tu profesor y vos siguen viviendo en la epoca de los 16 bits cuando un int tenia dos bytes.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| ||||
Cita: "65535 es el limite del INT no del long, estas cambiando todo lo que dije, como se supone que voy a guardar el numero 117734 en un INT?? .."
Iniciado por SiR.CARAJ0DIDA estoy hablando de puntero a puntero, no del int ni del long. Eso es dependiente de la arquitectura y no aplica a 32 bits.
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| |||
Cita: No, disculpa, he dicho que _no_ es necesario usar punteros a punteros cuando programas en C++ porque puedes usar _referencias_. Y que la función tal como la has planteado es una bobada.
Iniciado por SiR.CARAJ0DIDA bueno si vos sabes mas que mi profesor de la universidad haceme el programa con un solo puntero como vos decis a ver si anda. 65535 es el limite del INT no del long, estas cambiando todo lo que dije, como se supone que voy a guardar el numero 117734 en un INT?? .. Como ha dicho Eternal Idol, "int" depende de la arquitectura. Dado que no has indicado nada, suponemos que se trata de 32 bits, y como tal, un int tiene eso, 32 bits. En 32 bits (en la mayoría de compiladores) "int", "long int" y "long" es lo mismo. Su límite es de 0 a 4294967295 (sin signo). Supongo que lo de que un int ocupa 16 bits y el límite es 65535 te lo habrá dicho tu supersabiondo profesor de universidad, ¿me equivoco? ![]() |
| |||
Cita: Ya me dirás dónde... Porque MSDOS (y demás plataformas de 16 bits) desapareció cuando empezó la movida de Internet a llegar a todos los lugares...
Iniciado por SiR.CARAJ0DIDA no, nadie me dijo nada, eso lo lei por todos lados. |
| ||||
PD: Dirás que estás aprendiendo C y aún no has empezado con C++ ;) No, pero por lo general uno tiene dudas. Pense que ya lo habia demostrado. ![]() Y bueno, hasta donde yo se en la technologia de ahorita, in es de 32 bits y tiene un valor maximo de 2 a la 32 si no lleva signo. El long hasta donde yo se tiene 64 bit y le cabe muchisimo. Pero bueno, esos es lo que hasta ahora yo se y a la hora de programar uso sin problemas. Pero aun tengo una duda que no me respondes SiR.CARAJ0DIDA. Que es exactamente lo que quieres encontrar o leer o escribir en ese archivo? SOlo quiero saber que pretendes hacerle, porque como que haces y discutes pero no dices bien tu proposito, dices que solo leerlo, leerle que, los bytes? Saludos |
| ||||
int y long tienen exactamente el mismo tamaño en 32 bits, 4 bytes. printf("%u\r\n", sizeof(int)); printf("%u\r\n", sizeof(long));
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| |||
Cita: Da igual, lo digo o lo dices y no se lo creen ;)
Iniciado por Eternal Idol int y long tienen exactamente el mismo tamaño en 32 bits, 4 bytes. printf("%u\r\n", sizeof(int)); printf("%u\r\n", sizeof(long)); |
| |||
Cita: Como ya hemos dicho en total 3 veces, no.
Iniciado por Instru Y bueno, hasta donde yo se en la technologia de ahorita, in es de 32 bits y tiene un valor maximo de 2 a la 32 si no lleva signo. El long hasta donde yo se tiene 64 bit y le cabe muchisimo. En plataformas de 32 bits una variable de 64 bits es perfectamente posible: lee sobre INT64, INT32 y demás especificaciones de cómo declararlas en los diferentes compiladores. Una de 64 bits tiene de 0 a 18446744073709551615 (sin signo). |
| ||||
Cita: Yo no dije que fuera imposible. Lo que si es que alguna vez lei que long era de 64 bits o en si que era mas grande que int, por eso existe, sino de que sirve tener long, int y long int si todos son los mismo?En plataformas de 32 bits una variable de 64 bits es perfectamente posible: lee sobre INT64, INT32 y demás especificaciones de cómo declararlas en los diferentes compiladores. De todas manera voy a invstigarlo, porque si se me hizo extraño. Saludos |
| ||||
Instru, ¿Porque no probas el codigo que puse antes? Asi vas a comprobar el tamaño, con certeza, que usa tu compilador. printf("%u\r\n", sizeof(int)); printf("%u\r\n", sizeof(long));
__________________ ¡Peron cumple, Evita dignifica! VIVA PERON CARAJO |
| |||
Cita: Te repito: C es un estándar para decenas de plataformas en decenas de sistemas en decenas de procesadores. En 32 bits PC, simplemente "int" es lo mismo que "long int". Realmente "int" según el estándar debe significar o "short int" o "long int", una de las dos, la cual debe ser el número de bits de la plataforma (o algo similar).
Iniciado por Instru Yo no dije que fuera imposible. Lo que si es que alguna vez lei que long era de 64 bits o en si que era mas grande que int, por eso existe, sino de que sirve tener long, int y long int si todos son los mismo? De todas manera voy a invstigarlo, porque si se me hizo extraño. Saludos Con esas afirmaciones, tenemos que "int" debe ser de 32 bits, y como char es de 8 bits, "short int" se puso de 16, y por lo tanto "long int" de 32. Para resumir, "int" significa "long int". Como te dice Eternal Idol, simplemente haz un sizeof, no tiene más misterio. Y no sigas diciendo cosas como "si no por qué existe?" o "voy a investigarlo", que parece que no crees en lo que te decimos, cuando en realidad es muy básico ;) |