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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar un archivo texto a binario. (Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Pasar un archivo texto a binario. (Solucionado)  (Leído 17,558 veces)
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Pasar un archivo texto a binario. (Solucionado)
« en: 25 Marzo 2014, 07:20 am »

Hola esta es la siquiente duda que tengo.

quiero hacer esto.



No se como pasar lo que tengo en el txt a un archivo binario. lo de listar si se como hacerlo a si que lo que mas me interesa es hacer la convercion.

y tengo esto

Código
  1. #include <cstdlib>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <iomanip>
  5. #include "Cliente.h"
  6.  
  7. using namespace std;
  8.  
  9. int ArchivoBin();
  10.  
  11. int main(int argc, char *argv[])
  12. {
  13.   //Archivo de texto
  14.   ifstream lectura("Empleados.txt",ios::in);
  15.  
  16.    if(!lectura)
  17.    {
  18.         cout << "Error.  No se pudo"
  19.              << " abrir el archivo."
  20.              << endl;
  21.         system("pause");
  22.         return -1;
  23.    } // Verificación del archivo.
  24.  
  25.    // 2. Leer información.
  26.    int idCliente=0;
  27.    char nombre[20], apellido[20];
  28.    double ingreso;
  29.  
  30.    cout << '\n'
  31.         << setw(10) << "Codigo"
  32.         << setw(15) << "Nombre"
  33.         << setw(15) << "Apellido"
  34.         << setw(15) << "Ingreso L."
  35.         << setw(20) << "Archivo Texto"
  36.         << fixed << setprecision(2)
  37.         << endl;
  38.    for(int i=0; i<55; i++)
  39.        cout << '=';
  40.  
  41.    cout << endl;
  42.  
  43.    lectura >> idCliente
  44.            >> nombre
  45.            >> apellido
  46.            >> ingreso;
  47.  
  48.    while(!lectura.eof())
  49.    {
  50.       cout << setw(10) << idCliente
  51.         << right << setw(15) << nombre
  52.         << setw(15) << apellido
  53.         << setw(15) << ingreso << endl;
  54.  
  55.         lectura >> idCliente
  56.                 >> nombre
  57.                 >> apellido
  58.                 >> ingreso;
  59.    }
  60.  
  61.    lectura.close();
  62.  
  63.    ArchivoBin();
  64.  
  65.    system("PAUSE");
  66.    return EXIT_SUCCESS;
  67. }
  68.  
  69. int ArchivoBin()
  70. {
  71.    ofstream salida ("Empleados.bin", ios::binary);
  72.  
  73.    //Archivo de texto
  74.   ifstream lecturaBin("Empleados.bin", ios::binary);
  75.  
  76.    if(!lecturaBin)
  77.    {
  78.         cout << "Error.  No se pudo"
  79.              << " abrir el archivo."
  80.              << endl;
  81.         system("pause");
  82.         return -1;
  83.    } // Verificación del archivo.
  84.  
  85.    // 2. Leer información.
  86.    Cliente registro;
  87.    int idCliente=0;
  88.    char nombre[20], apellido[20];
  89.    double ingreso;
  90.  
  91.    cout << '\n'
  92.         << setw(10) << "Codigo"
  93.         << setw(15) << "Nombre"
  94.         << setw(15) << "Apellido"
  95.         << setw(15) << "Ingreso L."
  96.         << setw(20) << "Archivo Binario"
  97.         << fixed << setprecision(2)
  98.         << endl;
  99.    for(int i=0; i<55; i++)
  100.        cout << '=';
  101.  
  102.    cout << endl;
  103.  
  104.    lecturaBin.seekg((idCliente - 1) * sizeof(Cliente));
  105.    lecturaBin.read(reinterpret_cast<char *>(&registro), sizeof(Cliente));
  106.  
  107.    while(!lecturaBin.eof())
  108.    {
  109.       cout << setw(10) << idCliente
  110.         << right << setw(15) << nombre
  111.         << setw(15) << apellido
  112.         << setw(15) << ingreso << endl;
  113.  
  114.          lecturaBin.read(reinterpret_cast<char *>(&registro), sizeof(Cliente));
  115.  
  116.    }
  117.  
  118.    lecturaBin.close();
  119.    return 0;
  120. }

espero puedan ayudarme.

estos son los datos en el .txt por si quieren provarlo

1   Davolio   Nancy  900
2   Fuller   Andrew   678
3   Leverling   Janet  3000
4   Peacock   Margaret   78564
5   Buchanan   Steven  7865
6   Suyama   Michael 8000
7   King   Robert  700
8   Callahan   Laura  2000
9   Dodsworth   Anne  12345

y mi salida es esta.




« Última modificación: 26 Marzo 2014, 02:48 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #1 en: 25 Marzo 2014, 08:27 am »

Entendiendo por archivo de texto uno con un contenido legible tal que

Código:
100   Pedro   Rodriguez   2000
101   Laura   Fernandez   1890
102   Sergio  Berbes      2685

Pasar esto a binario es tan "sencillo" como volcar la información al fichero sin tratar previamente. Es decir, el código, por ejemplo, en un archivo de texto lo almacenas como si fuese un string, con X caracteres, uno por dígito... en binario este mismo campo ocuparía 4 bytes independientemente del valor del código ( 4 bytes = tamaño por defecto de un int ). Esto es aplicable a floats, booleanos, y demás tipos básicos. En el caso de las cadenas de texto, éstas no sufren ningún cambio.

Dicho esto, para generar un fichero binario desde C++ hay que pasarle un flag especial en la creación para que no haga las conversiones a string ( ios::binary ):

Código
  1. ofstream fichero( "fichero.bin", ios::out | ios::binary);

El resto del proceso es el mismo que para generar un fichero de texto normal.

Y para leer este archivo... pues lo mismo, el ifstream lo tienes que configurar con el flag ios::binary;


En línea

nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #2 en: 25 Marzo 2014, 08:49 am »

Si entiendo

Pero como le paso esos los datos al archivo de binario, ya intente el.

ofstream fichero( "fichero.bin", ios::out | ios::binary);

pero no me funciona. por que esta creando el fichero.bin, pero como le paso a ese fichero.bin los datos del txt.

si no es mucha molestia agradeceria algun ejemplo.
saludos y gracias por responder.
« Última modificación: 25 Marzo 2014, 09:18 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #3 en: 25 Marzo 2014, 09:19 am »

Código
  1. ofstream fichero("fichero.bin");
  2. fichero.write((char*) & idcliente,sizeof(int));

Con eso ya escribes el idcliente en binario, se procede igual con las demás variables, con la excepción de las que son char*:
Código
  1. fichero.write(nombre,strlen(nombre));

Aunque esto haría lo mismo:
Código
  1. fichero<<nombre;
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
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #4 en: 25 Marzo 2014, 09:28 am »

Si exacto asi tambien lo estaba tratando de hacer y mas facil.

Código
  1. fichero<<nombre;

creo que talvez lo que estoy haciendo mal puede ser esto.

Código
  1. fichero.write(nombre,strlen(nombre));

por que yo estoy leyendo en bin y como no hay datos primero tengo que escribirlos
bueno en este caso pasarlos de txt a binario intentare con lo que me indicas. y comento gracias por la ayuda.
En línea

Lo que se puede imaginar... se puede programar.
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #5 en: 25 Marzo 2014, 09:37 am »

todavía no me sale pero ya casi.

En línea

Lo que se puede imaginar... se puede programar.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #6 en: 25 Marzo 2014, 09:38 am »

No no. No tienes que "copiar" un fichero en otro.

Tienes que leer el contenido de uno de los archivos y escribir en el otro.

Lo que sucede es que escribir en binario requiere algún proceso adicional.

El proceso de grabación y lectura de binarios es un poco más escabroso en C++ con respecto a C.

Yo utilizo un par de funciones de ayudas ( me apoyo en templates para evitar reescribir código ):

Código
  1. #include <iomanip>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. template< class T > void
  9. binary_write( ostream& stream, const T& value )
  10. {
  11.  stream.write( reinterpret_cast< const char* >( &value ), sizeof( T ) );
  12. }
  13.  
  14. void
  15. binary_write_string( ostream& stream, const string& value, int max_size )
  16. {
  17.  int max = max_size - 1;
  18.  
  19.  if ( value.length( ) < max )
  20.    max = value.length( );
  21.  stream.write( value.c_str( ), max );
  22.  
  23.  for ( ; max < max_size; max++ )
  24.    stream << '\0';
  25. }
  26.  
  27. template< class T > void
  28. binary_read( istream& stream, T& value )
  29. {
  30.  stream.read( reinterpret_cast< char* >( &value ), sizeof( T ) );
  31. }
  32.  
  33. void
  34. binary_read_string( istream& stream, string& value, int max_size )
  35. {
  36.  value.clear( );
  37.  value.reserve( max_size );
  38.  
  39.  int pos;
  40.  for ( pos = 0; pos < max_size; ++pos )
  41.  {
  42.    char c;
  43.    stream >> c;
  44.    if ( c == '\0' )
  45.      break;
  46.  
  47.    value += c;
  48.  }
  49.  
  50.  stream.ignore( max_size - pos - 1 );
  51. }
  52.  
  53. int main()
  54. {
  55.  ofstream fich( "text.txt", ios::out | ios::binary );
  56.  
  57.  string text1 = "Prueba1";
  58.  string text2 = "Prueba2";
  59.  int dato = 1234;
  60.  
  61.  binary_write_string( fich, text1, 10 );
  62.  binary_write_string( fich, text2, 10 );
  63.  binary_write( fich, dato );
  64.  
  65.  fich.close( );
  66.  
  67.  ifstream fich2 = ifstream( "text.txt", ios::in | ios::binary );
  68.  
  69.  binary_read_string( fich2, text1, 10 );
  70.  binary_read_string( fich2, text2, 10 );
  71.  binary_read( fich2, dato );
  72.  
  73.  cout << text1 << endl << text2 << endl << dato << endl;
  74. }

En tu caso, para pasar de uno a otro primero tienes que leer el contenido del archivo de texto y después grabar el contenido en el archivo binario.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #7 en: 25 Marzo 2014, 09:42 am »

¿Escalabroso? Pero si es tan fácil como:
Código
  1. fichero.write((char*) & idcliente,sizeof(int));

Nolasco81, ¿qué código te genera esa captura?

Y por cierto, si lo que esperabas esque te saliesen 0 y 1 no va a suceder... La pantalla siempre solo muestra caracteres leíbles, no el valor de cada byte.
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
nolasco281


Desconectado Desconectado

Mensajes: 319


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #8 en: 25 Marzo 2014, 09:47 am »

No No.

no pretendo que me salgan cero y unos si no como ves en la captura uno dice archivo de texto y el otro Binario el la parte donde dice archivo binaro tiene que salir lo mismo que de texto.

Eferion

es correcto tengo que leer los archivo del txt y escribirlos en el binario.

y despues mostrar los datos del txt y binario para comprobar que son los mismos.

y si esta instruccion es correcta.

Código
  1. fichero.write((char*) & idcliente,sizeof(int));
cuando solo es binario si no me equivoco.

este codigo me genera esta salida.
Código
  1. registro.setIdCuenta(idCliente);
  2.   registro.setNombre(nombre);
  3.   registro.setApellido(apellido);
  4.   registro.setIngreso(ingreso);
  5.  
  6.    lecturaBin.seekp((idCliente - 1) * sizeof(Cliente));
  7.    lecturaBin.write(reinterpret_cast<char *>(&registro), sizeof(Cliente));
  8.  
  9.    while(!lecturaBin.eof())
  10.    {
  11.       cout << setw(10) << idCliente
  12.         << right << setw(15) << nombre
  13.         << setw(15) << apellido
  14.         << setw(15) << ingreso << endl;
  15.  
  16.  
  17.  
  18.          lecturaBin.write(reinterpret_cast<char *>(&registro), sizeof(Cliente));
  19.  
  20.          //lecturaBin >> idCliente
  21.          //        >> nombre
  22.          //        >> apellido
  23.          //        >> ingreso;
  24. }
« Última modificación: 25 Marzo 2014, 10:52 am por nolasco281 » En línea

Lo que se puede imaginar... se puede programar.
eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Pasar un archivo texto a binario.
« Respuesta #9 en: 25 Marzo 2014, 10:05 am »

El problema que tienes ( al menos uno de ellos ) es que los strings no se "deben" escribir alegremente en un archivo binario. El motivo es que no tiene un tamaño conocido y C++ no va a insertar un carácter de terminación en el archivo... si escribes un dos strings seguidos, en la lectura vas a leer los dos del tirón.

El ejemplo que te he puesto ( que se basa en unas funciones que encontré y mejoré hace ya unos años ) te permiten leer y escribir datos en archivos binarios de una forma sencilla y te permite despreocuparte del tipo de dato concreto... bueno si, el string tiene su función independiente... pero es así para permitir su lectura desde estructuras de C ( que suelen tener tamaño fijo ).

Se puede modificar el código fácilmente para que los strings no sean de tamaño fijo y que su lectura sea símplemente hasta encontrar el caracter nulo:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. template< class T > void
  8. binary_write( ostream& stream, const T& value )
  9. {
  10.  stream.write( reinterpret_cast< const char* >( &value ), sizeof( T ) );
  11. }
  12.  
  13. template< > void
  14. binary_write( ostream& stream, const string& value )
  15. {
  16.  stream.write( value.c_str( ), value.length( ) );
  17.  stream << '\0';
  18. }
  19.  
  20. template< class T > void
  21. binary_read( istream& stream, T& value )
  22. {
  23.  stream.read( reinterpret_cast< char* >( &value ), sizeof( T ) );
  24. }
  25.  
  26. template< > void
  27. binary_read( istream& stream, string& value )
  28. {
  29.  value.clear( );
  30.  
  31.  while ( true )
  32.  {
  33.    char c;
  34.    stream >> c;
  35.    if ( c == '\0' )
  36.      break;
  37.  
  38.    value += c;
  39.  }
  40. }
  41.  
  42. int main()
  43. {
  44.  ofstream fich( "text.txt", ios::out | ios::binary );
  45.  
  46.  string text1 = "Prueba1";
  47.  string text2 = "Prueba2";
  48.  int dato = 1234;
  49.  
  50.  binary_write( fich, text1 );
  51.  binary_write( fich, text2 );
  52.  binary_write( fich, dato );
  53.  
  54.  fich.close( );
  55.  
  56.  ifstream fich2 = ifstream( "text.txt", ios::in | ios::binary );
  57.  
  58.  binary_read( fich2, text1 );
  59.  binary_read( fich2, text2 );
  60.  binary_read( fich2, dato );
  61.  
  62.  cout << text1 << endl << text2 << endl << dato << endl;
  63. }
En línea

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

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pasar archivo de texto (.txt) a mayuscula
Java
Electoniko- 4 9,631 Último mensaje 8 Diciembre 2009, 06:16 am
por Electoniko-
Ayuda com archivo de texto, por favor.[Solucionado]
Scripting
carlosguay 3 6,806 Último mensaje 15 Diciembre 2009, 07:59 am
por carlosguay
(solucionado) Problemas de acceso en un archivo de texto
.NET (C#, VB.NET, ASP)
Eleкtro 0 1,906 Último mensaje 22 Noviembre 2012, 11:30 am
por Eleкtro
Pasar informacion de un textbox a un archivo de texto.
.NET (C#, VB.NET, ASP)
sadfud 1 2,921 Último mensaje 20 Febrero 2015, 18:38 pm
por Eleкtro
Pasar datos de un archivo binario a una lista dinamica
Programación C/C++
ezar147 3 3,595 Último mensaje 10 Junio 2017, 01:07 am
por ezar147
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines