Foros del Web » Programación para mayores de 30 ;) » Programación General »

Sobrecarga de operadores

Estas en el tema de Sobrecarga de operadores en el foro de Programación General en Foros del Web. Necesito sobrecargar los operadores >> y << para poder leer y escribir directamente a un fichero. No se como hacerlo. Me ayudan. Salu2...
  #1 (permalink)  
Antiguo 02/02/2004, 21:04
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Sobrecarga de operadores

Necesito sobrecargar los operadores >> y << para poder leer y escribir directamente a un fichero. No se como hacerlo. Me ayudan.
Salu2
__________________
Ing. Reynier Pérez Mira
  #2 (permalink)  
Antiguo 03/02/2004, 16:17
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
no creo que haya necesida de sobrecargarlo si es que estan en la libreria <ofstream.h>
podría ser algo así ??

#include <stdio.h>

class CFile
{
public:
CFile(char *file, int inout, int modo);

private:
FILE* archivo;
void operator<<(char *cadena);
};

void CFile::operator<<(char *cadena)
{
fprintf(archivo, "%s", cadena);
}

y asi seguirlo sobrecargando para todos los tipo de datos...

ahora para más seguridad deberías asegurarte que el archivo haya sido abiertamente bien... revisar el estado de los bits etc ; )
  #3 (permalink)  
Antiguo 03/02/2004, 20:46
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Mira mi clase ...

Mi clase principal es esta:
Código PHP:
 class CCodificador{
 private:
  
AnsiString cadenacadena_codificada;

  
int comparar(int iint j);

 public:
  
CCodificador();
  
void setCadena(AnsiString cad);
  
void ComprimeCad();
  
void Decodificar(AnsiString cad);
  
AnsiString getCadena();
  
AnsiString getCadenaComprimida();
  
ofstream &operator << (ofstream &out){
    
out << cadena.c_str()<<endl;
    
out << cadena_codificada.c_str();
   return 
out;
  }
  
ifstream &operator >>(ifstream &in){
    
in >> cadena_codificada.c_str();
    
in >> cadena.c_str();
   return 
in;
  }
}; 
ahora ahi los he sobrecargado, lo que pasa es que no me hace lo que yo quiero que es poner la cadena normal y la cadena codificada dentro del mismo archivo de salida. Pero me da problemas y solo me saca uno solo.

Esta es la implementación de las clases.
Código PHP:
 CCodificador::CCodificador(){
 
cadena "";
 
cadena_codificada "";
}
void CCodificador::setCadena(AnsiString cad){
 
cadena cad;
 
cadena_codificada "";
}
int CCodificador::comparar(int iint j) {
  
int aux 1;
  while (
cadena.c_str()[i+aux] == cadena.c_str()[j+aux]) aux++;
  return (
aux != 1)?aux:-1;
}
void CCodificador::ComprimeCad(){
 
TList Lista = new  TList();
 for (
int i 0cadena.Length()-1i++)
   for (
int j i+1cadena.Length(); j++) {
     
int aux;
     if (
cadena.c_str()[i] == cadena.c_str()[j] && (aux comparar(i,j)) > 0){
        
cadena.Delete(j+1,aux);
        
Nodo = new Nodo(aux,j-i,j+1);
        
Lista->Insert(0,t);
     }
 }
 
cadena_codificada cadena;
 
int count,aux;
 while (
Lista->Count 0) {
        
count 1;
        
Nodo t(0,0,0);
        
=  *(Nodo *) (Lista->First());
        
aux t.p;
        
Lista->Delete(0);
        while (
count <= Lista->Count){
          
aux += ((Nodo*)(Lista->First()))->p;
          
count++;
        }
        
cadena_codificada.Insert("COPIA("+IntToStr(t.i)+","+IntToStr(aux)+")",t.z);
 }
}

void CCodificador::DecodificarAnsiString cad){
  
int pos 0;
  while ((
pos cad.Pos("COPIA(")) != 0) {
    
cad.Delete(pos,6);
    
int aux1 StrToInt(cad.SubString(pos,cad.Pos(",")-pos));
    
cad.Delete(pos,cad.Pos(",")-pos+1);
    
int aux2 StrToInt(cad.SubString(pos,cad.Pos(")")-pos));
    
cad.Delete(pos,cad.Pos(")")-pos+1);
    
cad.Insert(cad.SubString(pos-aux2,aux1),pos);
  }
  
cadena cad;
}
AnsiString CCodificador::getCadena(){
 return 
cadena;
}
AnsiString CCodificador::getCadenaComprimida(){
  return 
cadena_codificada;

y esta es la llamada al metodo para escribir en un fichero
Código PHP:
 CCodificador Cod;
 
ifstream  fichero;
  
fichero.open("result.txt"ios_base::out );
  if(
fichero)
   
Caption "TRUE";
   
Cod >> fichero;

   
fichero.close(); 
me ayudan ??
__________________
Ing. Reynier Pérez Mira
  #4 (permalink)  
Antiguo 04/02/2004, 14:50
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
Porque en ves de retornar un objeto ofstream... no creas uno al comienzo, lo abres y escribes directamente ??
  #5 (permalink)  
Antiguo 04/02/2004, 18:40
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Me podrías explicar ...

Me podrías explicar como hago eso ?
__________________
Ing. Reynier Pérez Mira
  #6 (permalink)  
Antiguo 04/02/2004, 19:15
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
no ocupare toda tu definicion pero algo así

en el modulo private: crear un miembro ofstream
en el constructor abrir el archivo

Código PHP:
ofstream file;
file.open("archivo.txt"ios:out); 
luego sobrecargar el operador así

Código PHP:
void CClase::operator<<(char *string)
{
   
file << string;

sobrecargarlos para todos los tipos

y eso...

y en el destructor hacer
Código PHP:
file.close(); 
creoq eu debería resultar....
  #7 (permalink)  
Antiguo 06/02/2004, 01:20
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Mira ahora lo he hecho ....

Ahora lo he hecho de esta manera y me funciona perfectamente la entrada pero no se como implentar la salida.
Código PHP:
 class Nodo {
 public:
   
int ipz;
   
Nodo(int iiint ppint zz) { iippzz; }
};

class 
CCodificador{
 private:
  
AnsiString cadenacadena_codificada;
  
int comparar(int iint j);
 public:
  
CCodificador();
  
void setCadena(AnsiString cad);
  
void ComprimeCad();
  
void Decodificar(AnsiString cad);
  
AnsiString getCadena();
  
AnsiString getCadenaComprimida();
  
FILE fichero;

  
void operator >> (char *string){
   if (
fichero fopen("resultado.txt","a+")){
    
fprintf(fichero,"%s\n",string);
    
fclose(fichero);
   }
  }
 
/* void operator << (){
   fscanf(fichero,"%s",&files);
   }
  }      */
}; 
la llamada la hago de esta forma :
Cod >> Cod.getCadena().c_str();

y la salida al fichero es esta:
Modulador-demodulador
Modulador-demCOPIA(8,12)

pero no se como hacer para que me lea del fichero eso mismo y me lo ponga en el componente de tipo TMemo

Me ayudan ??
__________________
Ing. Reynier Pérez Mira
  #8 (permalink)  
Antiguo 06/02/2004, 10:23
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
Bueno yo tenía entendido quie el operador de entrada era <<, no sé porque las cadenas las escribes con >>, pero bueno :P

veamos si esto te resulta

Código PHP:
charCCadena::operator>>(void)
{
     
FILE *archivo fopen("resultado.txt","r");
     
char resultado[20];
     
fscanf(archivo"%s",resultado);
     
fclose(archivo);
     return 
resultado;

el problema acá es que solo retornamos un puntero hacia nuestra cadena... si sólo que quieres es realmente copiar la cadena en un vector, deberías hacerlo por referencia
  #9 (permalink)  
Antiguo 06/02/2004, 10:42
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
acá una implentacion basica de una clase CCadena

Código PHP:
#include <stdio.h>
#include <string.h>

class CCadena
{
    public:
        
//CCadena();
        
void operator<<(char *string);
        
void operator>>(char *string);

    private:
        
};

void CCadena::operator <<(char *string)
{
    
FILE *file fopen("resultado.txt""a+");
    
fprintf(file"%s"string);
    
fclose(file);
}

void CCadena::operator >>(char *string)
{
    
FILEfile fopen("resultado.txt""r");
    
fscanf(file"%s"string);
    
fclose(file);
}

void main(void)
{
    
CCadena micadena;
    
micadena << "Cadena";
    
micadena << "Me llamo Richard";
    
char cadena[20];
    
micadena >> cadena;

    
printf("cadena = %s\n"cadena);
    return;

Bueno no es una GRAN clase, pero creo que sirve para ver como al menos yo sobrecargaria los dos operadores....

Si te fijas al final la cadena "cadena" termina con el valor "cadenaMe", esto es porke scanf y fscanf leen hasta que haya una espacio...
  #10 (permalink)  
Antiguo 06/02/2004, 11:42
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Exclamación Sip pero ...

Si yo entiendo toda esa parte del código pero no se como sacar las dos cadenas que tengo en el fichero txt. Mira entra en esta web: http://reynierpm.webcindario.com/descargar.htm y ahi te puse el codigo fuente completo del programa con el ejecutable y todo para que veas que es lo que trato de hacer y no me resulta.
Salu2

PD: Gracias por ayudarme
__________________
Ing. Reynier Pérez Mira

Última edición por Reynier; 06/02/2004 a las 11:48
  #11 (permalink)  
Antiguo 06/02/2004, 14:44
 
Fecha de Ingreso: enero-2003
Ubicación: Stgo, Chile
Mensajes: 179
Antigüedad: 21 años, 3 meses
Puntos: 0
creo que el problema está acá

Código PHP:
void CCodificador::operator <<(char *string){
 
FILE *fichero fopen("resultado.txt","a+");
 
fscanf(fichero,"%s",string);
 
fclose(fichero);

línea :
FILE *fichero = fopen("resultado.txt","a+");

abres el fichero en modo "append", y resulta que al hacerlo as´te estas colocando al final del fichero, entonces no hay que leer
  #12 (permalink)  
Antiguo 06/02/2004, 15:54
Avatar de Reynier  
Fecha de Ingreso: noviembre-2002
Ubicación: Por ahí en algún sitio
Mensajes: 1.844
Antigüedad: 21 años, 5 meses
Puntos: 1
Sip pero ...

Te bajastes el código fuente que te puse en mi sitio y lor revisastes pues el problema es a la hora de leer del fichero y mostrar los resultados en un Edit.

Salu2
__________________
Ing. Reynier Pérez Mira
  #13 (permalink)  
Antiguo 07/02/2004, 16:57
Avatar de xavivars  
Fecha de Ingreso: enero-2002
Ubicación: Benissa - la Marina Alta
Mensajes: 212
Antigüedad: 22 años, 3 meses
Puntos: 1
Los prototipos para sobrecargar los operadores son los siguientes:

Caso lectura desde fichero
Código PHP:
friend ifstream operator>>(ifstream &,CCodificador &); 
En el caso de escritura en fichero, sustituir ifstream (fichero ios::in) por ofstream (fichero ios::out).

Para leer desde fichero se hace lo siguiente:
Código PHP:
CCodificador cod;
ifstream fichero;

fichero.open("result.txt");

fichero >> cod;

fichero.close(); 
Espero haber ayudado
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 02:54.