Manejo de Archivoc en C++

Iniciado por Nic88_bhba, 27 Octubre 2014, 22:17 PM

0 Miembros y 1 Visitante están viendo este tema.

Nic88_bhba

Hola necesito crear un programa en el cual ingrese datos en un archivo y despues los extraiga y seleccione uno de esos datos al azar. Hasta el momento pude crear el archivo y ingresar datos y tambien extraerlos pero no se como continuar. Agradeceria que me dieran una mano. Les dejo lo hecho hasta ahora.

#include <iostream>
#include <cstdlib>
#include <fstream>
#include <conio2.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[]) {
   
   int i = 0;
   
   ofstream entrada;
   
   entrada.open("texto2.txt" , ios::out | ios::app);
   
   if (entrada.fail())
      
   {
      
      cout<<"El archivo no se creo correctamente"<<endl;
      
      getch();
      
   } else
      
      {
         
         char palabra[20];
         
         strcpy (palabra,"argentina");
      
         entrada<<palabra<<endl;
         
         entrada.close();
         
         cout<<"Los datos fueron almacenados correctamente\n"<<endl;
         
         getch();
         
      }
   
   ifstream salida;
   
   salida.open ("texto2.txt" , ios::in);
   
   if (salida.fail())
      
   {
      
      cout<<"El archivo no pudo ser abierto o no existe"<<endl;
      
      getch();
      
   } else
      
      {
         string palabra;
         
         getline(salida,palabra);
         
         
         
         while (!salida.eof())
            
         {   
   
            
            getline(salida,palabra);
            
            cout<<palabra<<endl;
            
            i++;
            
            
         }
         
         
         
      }
   
   salida.close();
   
   getch();
   
   
   return 0;
}

rir3760

Lo primero que debes hacer es evitar el uso de la biblioteca conio de Borland, las razones de ello se explican en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

Ademas:

* Hay que cambiar el nombre del encabezado <string.h> ya que el nombre correcto es <cstring>, eliminar la variable "i" ya que no la utilizas en el programa y acortar algunas partes, por ejemplo este bloque:
Código (cpp) [Seleccionar]
char palabra[20];

strcpy (palabra,"argentina");
entrada<<palabra<<endl;
entrada.close();

Se puede reducir con el mismo efecto a solo:
Código (cpp) [Seleccionar]
entrada << "argentina" << endl;
entrada.close();


* Si no utilizas los argumentos pasados mediante la linea de comandos cambia la definicion de la funcion principal a "int main() ...".

* Hay que cambiar los nombres de las variables para el manejo de archivos ya que abren la puerta a errores lógicos, esto porque el archivo de salida (a donde envías los datos) se llama "entrada" mientras que el archivo de entrada (leer los datos del archivo) se llama "salida".

* Debido a la forma del bucle donde lees e imprimes las palabras la primera se descarta (no se imprime):
Código (cpp) [Seleccionar]
getline(salida,palabra);
while (!salida.eof()){
   getline(salida,palabra);
   cout<<palabra<<endl;
}

Para corregirlo basta con utilizar el valor de retorno de la función getline:
Código (cpp) [Seleccionar]
string palabra;
while (getline(salida,palabra))
   cout<<palabra<<endl;


----

En cuanto a la impresión de una palabra al azar leída del archivo lo primero que debes hacer es ... enviar mas de una palabra al archivo, por ejemplo con:
Código (cpp) [Seleccionar]
} else {
   entrada << "Hugo" << endl;
   entrada << "Paco" << endl;
   entrada << "Luis" << endl;
   entrada.close();
   
   cout<<"Los datos fueron almacenados correctamente\n"<<endl;
}


A continuación lees cada una de las lineas y las almacenas en un vector de cadenas utilizando las clases vector y string, los encabezados a incluir son <vector> y <string>. Para seleccionar una utilizas la funciones srand y rand. Mas o menos así:
Código (cpp) [Seleccionar]

int main()
{
   srand((unsigned) time(0));
   
   // ...

   } else {
      vector<string> palabra;
      string aux;
      while (getline(salida, aux))
         palabra.push_back(aux);
     
      int i = rand() % palabra.size();
      cout << palabra[i] << endl;
   }
   salida.close();


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Nic88_bhba

#2
Hola rir3760 te agradezco mucho que te tomes el tiempo de contestarme. Veo que tengo varios errores :o mas alla de no poder resolver el tema. Me parecio muy clara tu respuesta. Saludos.   ;D




Hola rir3760 quisiera saber si podrias resolverme una duda mas sobre este programa. La idea es crear una lista de palabras para el juego del ahorcado lo cual ya pude hacer y tome la parte de programacion del juego de unos tutoriales de youtube , ahora me interesaria poner las palabras en la lista seguida de la categoria a la que corresponden. Por ejemplo : en la lista tendriamos "argentina" y al lado la categoria a la que corresponde que en este caso seria "paises". Te agradezco nuevamente por haberme ayudado y espero no ser molestia. Saludos.

rir3760

Cita de: Nic88_bhba en 28 Octubre 2014, 20:15 PMahora me interesaria poner las palabras en la lista seguida de la categoria a la que corresponden. Por ejemplo : en la lista tendriamos "argentina" y al lado la categoria a la que corresponde que en este caso seria "paises".
En ese caso lo primero que debes hacer es declarar la estructura o tipo de dato para manejar el par palabra, categoría como una unidad, la forma mas sencilla (pero no la mejor) es indicando directamente la categoría de cada palabra:
Código (cpp) [Seleccionar]
struct Registro {
   string palabra;
   string categoria;
};


A continuación declaras un vector para almacenar cada uno de los registros:
Código (cpp) [Seleccionar]
vector<Registro> reg; // Cada uno de los registros (par palabra, categoria)

Las operaciones de lectura y escritura son similares al ejemplo anterior, cada registro se escribe/lee como un par de lineas. El orden no importa, puedes imprimir primero la palabra y después la categoría (o al revés) pero debes ser consistente: el orden que se utilice para la lectura debe ser el mismo utilizado en la escritura.

Por ejemplo la lectura de los datos seria mas o menos así:
Código (cpp) [Seleccionar]
ifstream in("Nombre_del_archivo");
vector<Registro> reg;

if (in.fail()){
   // Manejo de error
}else {
   Registro aux;
   while (getline(in, aux.palabra) && getline(in, aux.categoria))
      reg.push_back(aux);
   
   in.close();
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language