Páginas: 1 [2] 3
|
 |
|
Autor
|
Tema: Split en C (Leído 1363 veces)
|
|
Lambda
|
hice esta funcion no se si funcionara ya que no la probe pero en teoria deberia std::vector<char*> SplitearArchivo(const char* archivo, const char* firma, int tamanoarchivo) { std::vector<char*> tmpvec; FILE* f1 = fopen(archivo, "r"); //abrimos el archivo en modo lectura if(!f1) printf("imposible encontrar/abrir el archivo %s", archivo); //hace falta explicarlo? xD void* datosarchivo = malloc(tamanoarchivo); //reservamos memoria para leer el archivo memset(datosarchivo, 0, tamanoarchivo); //rellenamos todo con 0ros fread(datosarchivo, 1, tamanoarchivo, f1); //leemos todo el archivo fclose(f1); char* ptr = NULL; ptr = strtok((char*)datosarchivo, firma); tmpvec.push_back(ptr); //aqui "pusheamos" el primer token //empezamos a separar los demas tokens while(ptr) { ptr = strtok(NULL, firma); tmpvec.push_back(ptr); } //retornamos el vector return tmpvec; } utilizala asi std::vector<char*> partes; partes = SplitearArchivo("C:\\algunarchivo.exe", "mirasoyunafirma", 1024 (cambialo x el tamaño)); despues en partes[0], partes[1] etc tienes los datos
|
|
|
|
|
En línea
|
|
|
|
|
Lambda
|
.. borren esto XD ya es la segunda vez q me apsa
|
|
|
|
|
En línea
|
|
|
|
Freeze.
Desconectado
Mensajes: 2.455
FireSoft
|
Bueno, aca estoy un poquito mas informado y con un "nuevo" codigo: #include <windows.h> #include <stdio.h> #include <iostream> #include <string> std::string Split (std::string cadena, std::string int numero); char buff [260],Yo,*Cont,*palabras; short int i; const char Firma[12] = "[***---***]"; const char subFirma[12] = "[---***---]"; int tam; char a; std::string *p; int main() { FILE *file; HMODULE hMe = GetModuleHandle(NULL); DWORD nRet = GetModuleFileName(hMe,buff,260); file = fopen("C:\\fofo.exe","rb"); while((Yo = fgetc(file)) != EOF){ *p = Yo; } Split(*p,Firma,1); printf("%c",p); fclose(file); system("pause>nul"); return 0; } std::string Split (std::string cadena, std::string m, int numero) { int posicion; std::string principal; std::string secundaria; secundaria = cadena; for (int n = 0; n <= numero; n++) { posicion = secundaria.find (m); principal = (secundaria.substr (0,posicion)); secundaria = (secundaria.substr (posicion + 1,secundaria.length ())); } return principal; } A mi me da Unhandled Exception 
|
|
|
|
|
En línea
|
Un nuevo CMS, pruebalo:

|
|
|
E0N
Lab &
Colaborador
Desconectado
Mensajes: 2.682
|
Nuevo? esa funcion es mia y la hice hace ya.... 
|
|
|
|
|
En línea
|
|
|
|
Freeze.
Desconectado
Mensajes: 2.455
FireSoft
|
Jejeje hay una confusión me refiero a que modifique el codigo que puse en el primer post. No quiere decir nada de que yo hize esa función. La función Split esta bajo una licencia CreativaCammons y es propiedad de E0N 
|
|
|
|
|
En línea
|
Un nuevo CMS, pruebalo:

|
|
|
|
Lambda
|
Jejeje hay una confusión me refiero a que modifique el codigo que puse en el primer post. No quiere decir nada de que yo hize esa función. La función Split esta bajo una licencia CreativaCammons y es propiedad de E0N  en que sitio te tira la excepcion? PD: probaste mi codigo ? 
|
|
|
|
|
En línea
|
|
|
|
|
|
Freeze.
Desconectado
Mensajes: 2.455
FireSoft
|
Ok, ahora tengo esto pero sigue sin funcionar  #include <windows.h> #include <stdio.h> #include <iostream.h> #include <string> #include <stdlib.h> std::string Split (std::string cadena, std::string m, int numero); char buff [260],Yo,*Cont,*palabras; short int i; const char Firma[12] = "[***---***]"; const char subFirma[12] = "[---***---]"; int tam; char fileBuff; std::string p; std::string res; int main() { FILE *file; HMODULE hMe = GetModuleHandle(NULL); DWORD nRet = GetModuleFileName(hMe,buff,260); file = fopen("C:\\fofo.exe","rb"); while((fileBuff = fgetc(file)) != EOF){ Yo = fileBuff; p += Yo; res = Split(p,Firma,1); cout << res << endl; } fclose(file); system("pause>nul"); return 0; } std::string Split (std::string cadena, std::string m, int numero) { int posicion; std::string principal; std::string secundaria; secundaria = cadena; for (int n = 0; n <= numero; n++) { posicion = secundaria.find (m); principal = (secundaria.substr (0,posicion)); secundaria = (secundaria.substr (posicion + 1,secundaria.length ())); } return principal; }
|
|
|
|
|
En línea
|
Un nuevo CMS, pruebalo:

|
|
|
Freeze.
Desconectado
Mensajes: 2.455
FireSoft
|
Disculpen por el triple post  Esto me funciona: #include <windows.h> #include <stdio.h> #include <iostream.h> #include <string> #include <stdlib.h> std::string Split (std::string cadena, std::string m, int numero); char buff [260],Yo,*Cont,*palabras,fileBuff; short int i; const char *Firma = "¶"; const char *subFirma = "§"; int tam; std::string p, res; int main() { FILE *file; HMODULE hMe = GetModuleHandle(NULL); DWORD nRet = GetModuleFileName(hMe,buff,260); file = fopen("C:\\fofito.txt","rb"); if (file != 0) { cout << file << endl; while((fileBuff = fgetc(file)) != EOF) { Yo = fileBuff; p += Yo; res = Split(p,Firma,1); } cout << res << endl; fclose(file); } getchar(); return 1; } std::string Split (std::string cadena, std::string m, int numero) { int posicion; std::string principal; std::string secundaria; secundaria = cadena; for (int n = 0; n <= numero; n++) { posicion = secundaria.find (m); principal = (secundaria.substr (0,posicion)); secundaria = (secundaria.substr (posicion + 1,secundaria.length())); } return principal; } Pero -siempre hay pero- lo logré 'splitar' pero solo con un caracter no con una cadena de caracteres  Y así no me funciona porque casi todos los caracteres los usan todos los exes y eso no me conviene  Necesito encontrar una de las 2 soluciones o si hay tercera  - Un Caracter Ascii que no se use en los ejecutables. - 'Splitar' con una cadena de caracteres no con un caracter 
|
|
|
|
|
En línea
|
Un nuevo CMS, pruebalo:

|
|
|
Ferсhu
Desconectado
Mensajes: 1.221
Menos palabras y Mas codigos.
|
Aca tenes jeje estaba aburrido e hice la funcion. Espero q la entiendas y q te sirva. Es un poco rebuscada pero funciona, separa por palabras y por caracter. #include <stdio.h> #include <windows.h> int separar(char ***vector, char *cadena, char *buscada); int main(int argc, char *argv[]) { char frase[]="Holasss999 como estas 999freeze??? 999 :p999a999b999999c999d99aaaa999"; char **palabras; int cant,i; cant = separar(&palabras,frase,"999"); for(i=0;palabras[i];i++)printf("%s\n",palabras[i]); system("PAUSE"); return EXIT_SUCCESS; } int separar(char ***vector, char *cadena, char *buscada){ char **palabras; int tam,i,iant=0,n=0,cantidad=1; int tamtotal,tamfrase; tamtotal=strlen(cadena); tam=strlen(buscada); // recorro primero una vez para contar las partes, para no complicarla con realloc. for(i=0;i<tamtotal;i++){ while((cadena[i+n]==buscada[n])&&(n<tam))n++; if(n==tam)cantidad++; n=0; } palabras=(char **)malloc(cantidad * sizeof(char **)); cantidad=0; for(i=0;i<tamtotal;i++){ while((cadena[i+n]==buscada[n])&&(n<tam))n++; if(n==tam){ tamfrase=i-iant; palabras[cantidad]=(char*)malloc(tamfrase); memcpy(palabras[cantidad],&cadena[iant],tamfrase); palabras[cantidad][i-iant]=0; iant=i+tam; cantidad++; i=i+tam; } n=0; } tamfrase=i-iant; palabras[cantidad]=(char*)malloc(tamfrase); memcpy(palabras[cantidad],&cadena[iant],tamfrase); palabras[cantidad][tamfrase]=0; palabras[cantidad+1]=0; *vector=palabras; return cantidad; } El unico problema q tiene es q cuando hay 2 firmas juntas, la segunda se guarda en la cadena, pero me imagino q en la practica eso no se da. la funcion devuelve la cantidad-1 de palabras separadas, pero tambien se puede recorrer el vector sin saber eso, ya que el ultimo elemento del vector lo apunto a 0, por eso en el ejemplo al final no uso cant, pero tu hazlo como mas te guste. Saludos!!
|
|
|
|
|
En línea
|
|
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.221
Menos palabras y Mas codigos.
|
Animalito de diosss jaja upss...perdon. char Yo; "Yo" es un caracter, no una cadena de caracteres...jeje char Yo[2000]; y guarda lo q kieras ahi. Si necesitas mas agranda el numero, si no sabes el numero lo haces dinamicamente, osea, en ejecucion.
|
|
|
|
|
En línea
|
|
|
|
|
|
Ferсhu
Desconectado
Mensajes: 1.221
Menos palabras y Mas codigos.
|
pero guardar lo q kieras analizar en una cadena de caracteres, luegoo lo utilizas.
x ej, declara contenido[10000] y guarda el archivo o el texto q vas a anilzar.
|
|
|
|
|
En línea
|
|
|
|
|
|
|
Páginas: 1 [2] 3
|
|
|
|