Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mauroooooooo en 17 Abril 2012, 19:13 pm



Título: manejo de archivos en C++
Publicado por: mauroooooooo en 17 Abril 2012, 19:13 pm
buenas, estoy tratando de crear una especie de compilador, este mismo lee un archivo linea por linea, en cada linea lee hasta que se encuentre un _ y lo guarda en una variable una vez que tengo la variable la comparo con otro y asi sucesivamente, hasta el momento ya pude hacer que lea hasta que se encuentre el _ y lo guarde en una variable para luego hacer la comparacion, pero no he podido limpiar la variable y hacer q salte de linea para seguir comparando, esto seria lo que llevo programado por el momento

void Compilar()
{
char palabra=1;
string ruta=" ",abc=" ",compara="MOSTRAR_"; //variable de prueba

system("cls");
MOSTRAR_ "Digite la ruta del archivo para compilar\n";
cin>>ruta;

ifstream f;
stringstream expresion;

f.open ("programar.txt", ifstream::in);

while (! f.eof() )
{

while (f.good() && (palabra != '_') )
{
palabra = f.get();
expresion << palabra;

}

while (expresion >> abc)
{
MOSTRAR_ abc<<"\n";
if(compara==abc)
{
MOSTRAR_ "Perfect Match" << endl; // este if es para ver si reconoce la variable copiada contra un string
system("pause");
}
}
expresion.clear();
}


f.close();


}

utilice esta funcion while (! f.eof() ) pensando en que con eso iba a leer linea por linea y la funcion expresion.clear(); al final del while para que limpie y vuelva a leer pero no me funciono, agradeceria mucho su ayuda ya que soy un poco nuevo en esto, gracias


Título: Re: manejo de archivos en C++
Publicado por: Beakman en 19 Abril 2012, 03:45 am
Código
  1. expresion.clear();
No sirve para vaciar la variable, sino para vaciar el estado de error.
Para esto hacé lo siguiente:
Código
  1. expresion.str( "" );

Después, yo siempre creo que está muy mal usar funciones/métodos void. Algún valor deberías retornar, y más cuando estás tratando con archivos. Por ejemplo, deberías validar que se haya abierto el archivo primero:
Código
  1. f.open ( "programar.txt", ifstream::in );
  2. if( !f.good ){
  3.     cout << "Error abriendo el archivo." << endl;
  4.     return false;
  5. }
  6. while ( !f.eof() ){
  7.     // hacer cosas
  8. }

En cuanto al resto, trata de no usar tantos whiles. Del archivo de texto que abrís deberías tomar letra por letra hasta encontrar un espacio. En ese punto almacenas los valores que necesites, y continuas tomando caracteres.