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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Manejo de Archivoc en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Manejo de Archivoc en C++  (Leído 2,073 veces)
Nic88_bhba

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Manejo de Archivoc en C++
« en: 27 Octubre 2014, 22:17 pm »

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;
}


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Manejo de Archivoc en C++
« Respuesta #1 en: 28 Octubre 2014, 02:00 am »

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
  1. char palabra[20];
  2.  
  3. strcpy (palabra,"argentina");
  4. entrada<<palabra<<endl;
  5. entrada.close();
Se puede reducir con el mismo efecto a solo:
Código
  1. entrada << "argentina" << endl;
  2. 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
  1. getline(salida,palabra);
  2. while (!salida.eof()){
  3.   getline(salida,palabra);
  4.   cout<<palabra<<endl;
  5. }
Para corregirlo basta con utilizar el valor de retorno de la función getline:
Código
  1. string palabra;
  2. while (getline(salida,palabra))
  3.   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
  1. } else {
  2.   entrada << "Hugo" << endl;
  3.   entrada << "Paco" << endl;
  4.   entrada << "Luis" << endl;
  5.   entrada.close();
  6.  
  7.   cout<<"Los datos fueron almacenados correctamente\n"<<endl;
  8. }

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
  1. int main()
  2. {
  3.   srand((unsigned) time(0));
  4.  
  5.   // ...
  6.  
  7.   } else {
  8.      vector<string> palabra;
  9.      string aux;
  10.      while (getline(salida, aux))
  11.         palabra.push_back(aux);
  12.  
  13.      int i = rand() % palabra.size();
  14.      cout << palabra[i] << endl;
  15.   }
  16.   salida.close();

Un saludo


En línea

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

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Manejo de Archivoc en C++
« Respuesta #2 en: 28 Octubre 2014, 20:15 pm »

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.
« Última modificación: 31 Octubre 2014, 19:41 pm por Eternal Idol » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Manejo de Archivoc en C++
« Respuesta #3 en: 1 Noviembre 2014, 03:31 am »

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".
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
  1. struct Registro {
  2.   string palabra;
  3.   string categoria;
  4. };

A continuación declaras un vector para almacenar cada uno de los registros:
Código
  1. 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
  1. ifstream in("Nombre_del_archivo");
  2. vector<Registro> reg;
  3.  
  4. if (in.fail()){
  5.   // Manejo de error
  6. }else {
  7.   Registro aux;
  8.   while (getline(in, aux.palabra) && getline(in, aux.categoria))
  9.      reg.push_back(aux);
  10.  
  11.   in.close();
  12. }

Un saludo
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines