Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kaxperday en 30 Octubre 2015, 18:41 pm



Título: basura al final de cadena
Publicado por: Kaxperday en 30 Octubre 2015, 18:41 pm
Código
  1. void escribe()
  2. {
  3. FILE *a = NULL;
  4. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "ab");
  5. u_char *o = (u_char*)"BUENOS DIASSS";
  6. fwrite(o, sizeof(u_char), strlen("BUENOS DIASSS"), a);
  7. fclose(a);
  8. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "rb");
  9. fseek(a, 0, SEEK_END);
  10. int c = ftell(a);
  11. cout << c;
  12. fseek(a, 0, SEEK_SET);
  13. u_char *d = new u_char[c]();
  14. fread(d, sizeof(u_char), c, a);
  15. cout << (char*)d;
  16. fclose(a);
  17. }

Llamo a esta funcion 6 veces, salida:

Citar
BUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSS²²²²-¿B-óÙc
Porque hay basura?

Y cada vez va saliendo más.


Título: Re: basura al final de cadena
Publicado por: ivancea96 en 30 Octubre 2015, 18:51 pm
¿Y el caracter nulo con el que terminan las cadenas, sin el cual no se puede saber cuando acaba? fread no lo pone.


Título: Re: basura al final de cadena
Publicado por: Kaxperday en 30 Octubre 2015, 18:58 pm
Código
  1. FILE *a = NULL;
  2. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "ab");
  3. u_char *o = (u_char*)"BUENOS DIASSS\0";
  4. fwrite(o, sizeof(u_char), strlen("BUENOS DIASSS\0"), a);
  5. fclose(a);
  6. a = fopen("C:\\Users\\Usuario\\Desktop\\PRUEBA.txt", "rb");
  7. fseek(a, 0, SEEK_END);
  8. int c = ftell(a);
  9. cout << c;
  10. fseek(a, 0, SEEK_SET);
  11. u_char *d = new u_char[c]();
  12. fread(d, sizeof(u_char), c, a);
  13. cout << (char*)d;
  14. fclose(a);

Código
  1. BUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSSBUENOS DIASSS²²²²



Título: Re: basura al final de cadena
Publicado por: ivancea96 en 30 Octubre 2015, 21:04 pm
Mother of god.
Esa cadena no necesita un caracter nulo explícito. Cuando pones "", ya viene con caracter nulo.

La que necesita un caracter nulo es la que se lee del archivo. fread, como dije, no coloca caracteres nulos.

Código
  1. cout << (char*)d;
¿Cómo sabe ostream::operator<< la longitud de la cadena apuntada por d?


Título: Re: basura al final de cadena
Publicado por: Kaxperday en 30 Octubre 2015, 21:34 pm
Ahhh ok entendí mal jaja gracias XD