elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error en tiempo de ejecución al hacer un stream con fwrite
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Error en tiempo de ejecución al hacer un stream con fwrite  (Leído 6,446 veces)
ccjrocks

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Error en tiempo de ejecución al hacer un stream con fwrite
« en: 15 Junio 2013, 15:40 pm »

Muy buenas cracks, tengo un problemilla que me está frustrando bastante, os dejo el code para que veáis que falla, seguro que es una chorrada:


Código:
long tellFileSizeSTREAM(ifstream& FileToAnalize){
long startpoint=FileToAnalize.tellg();
long retorno=0;
FileToAnalize.seekg(0,ios_base::end);
retorno=FileToAnalize.tellg();
FileToAnalize.seekg(0,startpoint);
return retorno;
}


//A PARTIR DE AQUÍ ESTE CODE ESTÁ DENTRO DEL MAIN
ifstream readfile;
readfile.open(readpath.c_str(),ios::binary); //readpath es un string con la ruta
long readfilesize=tellFileSizeSTREAM(readfile);
while(readfile.good()){
char writebuffer;
readfile.read(&writebuffer,1);
outputfile.write(&writebuffer,1);
}

Lo extraño esque me da error en tiempo de ejecucción de violación de acceso a memoria, he probado a cambiar el código de mil maneras posibles pero no tengo ni idea de qué puede ser :-( A alguno os ha pasado esto?

Ah, y tengo que ir char a char porque quiero hacer una manipulación en ellos. A ver si alguno sabe lo que es. Gracas de antemano :silbar:


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #1 en: 15 Junio 2013, 16:00 pm »

Código
  1. while(readfile.good())

Esto no es correcto, para leer hasta final de archivo:

Código
  1. while(!readfile.eof())

Y aunque hagas una manipulación, no tienes que leer char a char. Puedes leer una línea (readfile.getline), modificarla y después escribirla.


En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
ccjrocks

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #2 en: 15 Junio 2013, 18:03 pm »

Me temo que ya lo había probado  :( (Lo de readfile.eof)

En línea

lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #3 en: 15 Junio 2013, 18:45 pm »

Pues no se lo único que veo es que en la función "tellFileSizeSTREAM" creo que deberías cambiar esta línea:
Código
  1. retorno=FileToAnalize.tellg()-startpoint;

Pero no estoy seguro por que no se para que usas esa función.

Una pregunta, ¿el archivo que intentas copiar tiene muchos espacios al principio?
En línea

ccjrocks

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #4 en: 15 Junio 2013, 19:13 pm »

La función está bien, lo que hace es devolver el tamaño del fichero sin resetear el puntero del stream.

El principio del fichero es el siguiente:

Código:
MZ       ÿÿ  ¸       @                                   €   º ´	Í!¸LÍ!This program cannot be run in DOS mode.

$       PE  L š#²Q        à     >   4      ¾]       `    @                       à          @…                           d]  W    €  à.                   À      `                                                               H           .text   Ä=       >                    `.sdata  8   `      B              @  À.rsrc   à.   €   0   D              @  @.reloc      À      t              @  B                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ]      H     1  L,       P
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #5 en: 15 Junio 2013, 19:22 pm »

Supongo que estás haciendo un crypter o algo así... no?

Abres el archivo pasándole el flag ios::binary, pero no el flag ios::in. No sé si eso puede causar el error, pero prueba a cambiarlo.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #6 en: 15 Junio 2013, 20:13 pm »

Vale, ya sé cual es un fallo. Resulta que read y write no se desplazan por el fichero solo leen y escriben empezando por el principio(a no ser que especifiques un offset).
Tendrías que usar put y get:
Código
  1. while(readfile.good()){
  2. char writebuffer=readfile.get();
  3.  
  4. if(readfile.good())outputfile.put(writebuffer);
  5. }
  6. readfile.close();
  7. outputfile.close();

A ver si te funciona esto...

Por otra parte tengo que decir que el error que te da no tiene pinta de ser por eso. Tengo la impresión de que en algún lugar se ha modificado un puntero. La dirección 0x20202020 es muy sospechosa, 0x20 en ascii es un espacio. ¿Cabe la posibilidad de que el error esté en otro sitio?
« Última modificación: 15 Junio 2013, 20:40 pm por lapras » En línea

ccjrocks

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #7 en: 15 Junio 2013, 21:23 pm »

Supongo que estás haciendo un crypter o algo así... no?

Abres el archivo pasándole el flag ios::binary, pero no el flag ios::in. No sé si eso puede causar el error, pero prueba a cambiarlo.

Saludos.

Creo que no le he pasado el flag ios::in no?? :-\
Y sí, es un crypter  ;D

Vale, ya sé cual es un fallo. Resulta que read y write no se desplazan por el fichero solo leen y escriben empezando por el principio(a no ser que especifiques un offset).
Tendrías que usar put y get:
Código
  1. while(readfile.good()){
  2. char writebuffer=readfile.get();
  3.  
  4. if(readfile.good())outputfile.put(writebuffer);
  5. }
  6. readfile.close();
  7. outputfile.close();

A ver si te funciona esto...

Por otra parte tengo que decir que el error que te da no tiene pinta de ser por eso. Tengo la impresión de que en algún lugar se ha modificado un puntero. La dirección 0x20202020 es muy sospechosa, 0x20 en ascii es un espacio. ¿Cabe la posibilidad de que el error esté en otro sitio?

He probado tu code y esta vez me da el error 0x05, que cambiando el code de otras formas también me daba. Los errores que recibo probando diferentes codes son el 0x05 y 0x20 siempre.

Y he estado investigando y te diré que el read SÍ desplaza el fichero, osea que seguimos como al principio...

Creo que debe ser algo relacionado con el final de fichero, porque he probado también:

Código:
	while(!readfile.bad()){


char writebuffer;
readfile.read(&writebuffer,1);
outputfile.write(&writebuffer,1);

}

Y funciona, lo que pasa que no para, se vuelve loco y escribe el fichero una y otra vez hasta que lo cierras. Si pruebo con:

Código:
	while(!readfile.eof()){


char writebuffer;
readfile.read(&writebuffer,1);
outputfile.write(&writebuffer,1);

}

Me lee sólo parte del fichero, es decir, el fichero origen ocupa 28K y el de destino 30K, osea que para antes de llegar al final.

Prácticamente ahora sólo queda comprobar el final de fichero, se os ocurre algún método¿? (ya que con eof()) no lo conseguimos)

EDITO: Con este código pasa lo mismo que con el último ejemplo:
Código:
	while(!readfile.bad()){

long actpos=readfile.tellg();
if(actpos==readfilesize){
break;
}
char writebuffer;
readfile.read(&writebuffer,1);
outputfile.write(&writebuffer,1);

}
« Última modificación: 15 Junio 2013, 22:17 pm por ccjrocks » En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #8 en: 15 Junio 2013, 22:30 pm »

No has pensado en hacer algo como esto?:

Código
  1. uint64_t getFileSize(istream& stream)
  2. {
  3. uint64_t cur, ret;
  4. cur = stream.tellg();
  5. stream.seekg(0, ios::end);
  6. ret = stream.tellg();
  7. stream.seekg(cur, ios::beg);
  8.  
  9. return ret;
  10. }
  11.  
  12. ifstream readfile(readpath.c_str(), ios::binary|ios::in);
  13.  
  14. uint64_t fileSize = getFileSize(readfile);
  15. char *buf = new char[fileSize];
  16. readfile.read(buf, fileSize);
  17.  
  18. for(size_t i=0; i<fileSize; i++)
  19. {
  20. /* Haces lo que quieras con buf[i] */
  21. outputfile.put(buf[i]);
  22. }
  23.  
  24. delete[] buf;
  25.  

Lo veo un poco menos confuso no?
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
lapras

Desconectado Desconectado

Mensajes: 140



Ver Perfil WWW
Re: Error en tiempo de ejecución al hacer un stream con fwrite
« Respuesta #9 en: 15 Junio 2013, 22:43 pm »

Pues es raro que no te funcione mi código porque a mi si me funciona, puede que el error esté en otro sitio.
Mi código completo es este:
Código
  1. #include<iostream>
  2. #include<fstream>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7. ofstream outputfile;
  8. outputfile.open("file1",ios::out);
  9. ifstream readfile;
  10. readfile.open("file2",ios::in);
  11.  
  12.  
  13. while(readfile.good()){
  14. char writebuffer=readfile.get();
  15.  
  16. if(readfile.good())outputfile.put(writebuffer);
  17. }
  18. readfile.close();
  19. outputfile.close();
  20. }

Tenías razón sobre lo del read y write, si que desplazan.
Otra manera que me funciona es esta:

Código
  1. #include<iostream>
  2. #include<fstream>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7. ofstream outputfile;
  8. outputfile.open("file1",ios::out);
  9. ifstream readfile;
  10. readfile.open("file2",ios::in);
  11.  
  12. char writebuffer;
  13. while(readfile.read(&writebuffer,1)){
  14. if(readfile.good())outputfile.write(&writebuffer,1);
  15. }
  16. readfile.close();
  17. outputfile.close();
  18. }
« Última modificación: 15 Junio 2013, 23:01 pm por lapras » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
error 458 en tiempo de ejecucion
Programación Visual Basic
wACtOr 0 3,165 Último mensaje 18 Junio 2007, 16:20 pm
por wACtOr
Ayuda Error 92 en tiempo de Ejecucion
Programación Visual Basic
mastercss 8 6,390 Último mensaje 23 Abril 2014, 14:46 pm
por abkanis
winsock error 10035 en tiempo de ejecucion
Programación Visual Basic
Dark4ngel 3 3,660 Último mensaje 10 Noviembre 2011, 18:12 pm
por Dark4ngel
Hacer instrucción en tiempo de ejecución.
.NET (C#, VB.NET, ASP)
NetJava 1 2,527 Último mensaje 5 Enero 2012, 12:42 pm
por NetJava
error en tiempo de ejecucion en programa c++
Programación C/C++
tca153 9 6,241 Último mensaje 9 Agosto 2021, 20:59 pm
por tca153
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines