Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Modificar archivo binario

Estas en el tema de Modificar archivo binario en el foro de C/C++ en Foros del Web. Hola, estoy haciendo un programa y desearia ayuda, en el creo un archivo llamado "Lectura.dat", en el que guardo 3 nombres cualquiera, y son exportados, ...
  #1 (permalink)  
Antiguo 02/08/2011, 21:54
Avatar de baker1562  
Fecha de Ingreso: marzo-2011
Ubicación: Puntarenas
Mensajes: 261
Antigüedad: 13 años, 9 meses
Puntos: 9
Pregunta Modificar archivo binario

Hola, estoy haciendo un programa y desearia ayuda, en el creo un archivo llamado "Lectura.dat", en el que guardo 3 nombres cualquiera, y son exportados, lo que deseo es modificarlo con la opcion 4 del programa, para que se modifique la posicion a la cual llamo, agradezco su ayuda.

Código C++:
Ver original
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <fstream>
  4. #include <cstdlib>
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.     int opcion;           //variable para escoger el case en el swith
  11.     char palabras[3][100];
  12.     int i=0;
  13.     int contador;
  14.     int posicion;      //char de 100 elementos para guardar cualquier palabra
  15.     string respuesta;         //pertenece al while
  16.    
  17.    
  18.    
  19.    
  20.    
  21.     while(respuesta!="N" && respuesta!="n")
  22.     {
  23.    
  24.     cout<<"Digite la opcion#1, para escribir en el archivo de lectura!!!"<<endl;
  25.     cout<<"Digite la opcion#2, para mostrar el archivo de lectura!!!"<<endl;
  26.     cout<<"Digite la opcion#3, para mostrar la matriz!!!"<<endl;
  27.     cout<<"Digite 4, para cambio"<<endl;
  28.     cout<<endl;
  29.     cout<<"Que opcion desea realizar?"<<endl;
  30.     cin>>opcion;
  31.    
  32.     ifstream ArchivoI2("i.dat", ios::in);
  33.     ArchivoI2>>i;
  34.    
  35.     switch(opcion)
  36.     {
  37.                   case 1:
  38.                         {
  39.                             if(i<3)
  40.                             {
  41.                         ofstream ArchivoLectura("Lectura.dat",ios::binary|ios::app );  //el oftream abre o crea un archivo de escritura, el ios::out abriera el archivo y escrbiera algo nuevo en el
  42.                         ofstream ArchivoContador("Contador.dat", ios::out);
  43.                         ofstream ArchivoI("i.dat", ios::out);
  44.                        
  45.                         if(!ArchivoLectura)     //if por si el archivo no existe
  46.                         {
  47.                            cerr<<"No se pudo abrir el archivo"<<endl;
  48.                            cout<<endl;
  49.                            system("pause");
  50.                            exit(1);
  51.                            }
  52.                            cout<<"Ingrese algo en letras:"<<endl;        //se ingresa cualquier palabra
  53.                            cin>>palabras[i];
  54.                            
  55.                            ArchivoLectura<<palabras[i]<<endl;        //la palabra pasa al archivo externo
  56.                            contador=i;
  57.                            i++;
  58.                            
  59.                            ArchivoContador<<contador;
  60.                            ArchivoI<<i;
  61.                            
  62.                            }
  63.                            else
  64.                            {
  65.                                cout<<"Memoria Llena"<<endl;
  66.                                cout<<endl;
  67.                                system("pause");
  68.                                }
  69.                                }
  70.                            
  71.                   break;
  72.                  
  73.                   case 2:
  74.                         {
  75.                         ifstream ArchivoLectura2("Lectura.dat", ios::in);      //ifstream sirve para mostrar el archivo, el ios::in lo muestra en consola
  76.                         ifstream ArchivoContador2("Contador.dat", ios::in);
  77.                        
  78.                         if(!ArchivoLectura2)             //if por si no existe el archivo
  79.                         {
  80.                           cerr<<"No se pudo abrir el archivo!!"<<endl;
  81.                           cout<<endl;
  82.                           system("pause");
  83.                           exit(1);
  84.                           }
  85.                          
  86.                           ArchivoContador2>>contador;
  87.                           for(int i=0;i<(contador+1);i++)
  88.                           {
  89.                           ArchivoLectura2>>palabras[i];                 //se mostrara lo que hay en el archivo anterior
  90.                           }
  91.                           for(int i=0;i<(contador+1);i++)
  92.                           {
  93.                           cout<<palabras[i]<<endl;
  94.                           }                  
  95.                          
  96.                           system("pause");
  97.                           }
  98.                   break;
  99.                  
  100.                   case 3:
  101.                        
  102.                        {
  103.                                  for(int i=0;i<(contador+1);i++)
  104.                                  {
  105.                                          cout<<palabras[i]<<endl;
  106.                                          
  107.                                          }
  108.                                          system("pause");
  109.                                          }
  110.                        break;
  111.                        
  112.                   case 4:
  113.                        {
  114.                              cout<<"Que posicion desea mostrar?"<<endl;
  115.                              cin>>posicion;
  116.                        
  117.                                   cout<<"La palabra es: "<<palabras[posicion]<<endl;
  118.                                   system("pause");
  119.                                  
  120.                                   cout<<"Escriba la nueva palabra:"<<endl;
  121.                                   cin>>palabras[posicion];
  122.                                  
  123.                                   ofstream ArchivoLectura("Lectura.dat", ios::app|ios::binary);
  124.                                  
  125.                                   ArchivoLectura.seekp(posicion,ios::beg);
  126.                                  
  127.                                   ArchivoLectura.write(palabras[posicion], sizeof(posicion));
  128.                        
  129.                                  
  130.                                   }
  131.                   break;
  132.                   }
  133.                  
  134.                   cout<<"Desea realizar otra accion s/n?"<<endl;
  135.                   cin>>respuesta;
  136.                   system("cls");
  137.                   }
  138.                  
  139.                   return 0;
  140.                  
  141.                   }
  #2 (permalink)  
Antiguo 03/08/2011, 01:32
Avatar de gvite666  
Fecha de Ingreso: abril-2010
Mensajes: 65
Antigüedad: 14 años, 8 meses
Puntos: 4
Respuesta: Modificar archivo binario

Pues mira, como yo lo haria de dos opciones:
una es poniendole un indicador a cada palabra...como es esto, bueno, mira si en tu archivo escribes asi:
pedro*juan*gera
Entonces puedes utilizar esta sentencia
Archivo.getline(palabra,128,'*');
cuales los parametros son
palabra: es el puntero a una cadena de tipo char
128: es el numero de bytes que quieres leer incluyendo caracter nullo (\0)
'*': es el delimitador de lectura, asea que va a leer hasta que encuentre este caracter

asi si kieres el segundo nombre pues pones solo pones un while hasta que lea esa palabra:
Código C++:
Ver original
  1. cout<<"Dame la posicion: ";
  2. cin>>ipos;
  3. while(ipos)
  4. {
  5.     fe.getline(cadena, 128,'*');
  6.     ipos--;
  7. }

Con esto solo debes resolver el problema de la longitud de cadenas, ejemplo si lees la cadena "juan" y la modificas por la de enrique

entonces tu archivo va a sermodificado de esta manera
pedro*enriquera

borrando parte de la tercer cadena, yo lo arreglaria poniendo una longitud predeterminada a las cadenas, por ejemplo que sean de 10, entonces tu archivo queda asi
pedro *juan *gera *
rellenando la longitud restante con espacios, ya solo al leer borras esos espacios y listo...

y la segunda es: Ya sabiendo esto de las cadenas con misma longitud, pues ya sabes sus posiciones de cada palabra, ejemplo:
la primer palabra esta desde la posicion 0 hasta la 10, la segunda desde la 11 a la 20 y la tercera desde la 21 hasta la 30, debes tener en cuenta el asterisco tambien, asi que por eso se ve disparejo, pero te lo explico mas sencillo

si quieres la primer palabra tienes que empezar de cero, para la segunda desde 11, para la tercera 21 y aki ya aumenta de diez en diez

asi si te pide cualquier posicion lo puedes hacer asi:
Código C++:
Ver original
  1. if(iPosDada==1)
  2.       iPosPalabra=0;
  3. else
  4.       iPosPalabra= (--iPosDada*10)+1;
  5. Archivo.seekg(ipos,ios::beg);
  6. Archivo.getline(cadena, 11,'*');

Espero te sirva
Saludos
P.D. Esto es como yo lo haria, si hay otra idea mas eficiente, estaria encantado de probarla, pues asi es como se aprende.
__________________
No pienses si no vas a actuar.
  #3 (permalink)  
Antiguo 03/08/2011, 07:49
Avatar de baker1562  
Fecha de Ingreso: marzo-2011
Ubicación: Puntarenas
Mensajes: 261
Antigüedad: 13 años, 9 meses
Puntos: 9
Respuesta: Modificar archivo binario

mmmm me enrede =(

Etiquetas: binario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:21.