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

[SOLUCIONADO] Como creo un archivo a partir de una variabe

Estas en el tema de Como creo un archivo a partir de una variabe en el foro de C/C++ en Foros del Web. Buenas, quiero hacer un programa que me vaya creando arhivos, pero el nombre del arhivo lo escoja el usuario, por ejemplo que me pida "Ingrese ...
  #1 (permalink)  
Antiguo 26/09/2015, 10:38
 
Fecha de Ingreso: septiembre-2015
Mensajes: 9
Antigüedad: 8 años, 7 meses
Puntos: 0
Como creo un archivo a partir de una variabe

Buenas, quiero hacer un programa que me vaya creando arhivos, pero el nombre del arhivo lo escoja el usuario, por ejemplo que me pida "Ingrese nombre del archivo" y luego pues se cree ese archivo, pero no lo logro hacer, solo puedo crear un archivo con un mismo nombre, esto tengo:

Código:
#include <iostream.h>
#include <conio.h>
#include <fstream.h>

int main() {

ofstream archivo;
archivo.open("Empresa");

archivo <<"Empresa Los Animales";
archivo.close();

getch();
}
  #2 (permalink)  
Antiguo 27/09/2015, 05:42
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Como creo un arhivo a partir de una variabe

Código C++:
Ver original
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. using namespace std;
  5.  
  6. int main() {
  7.  
  8.     ofstream archivo;
  9.     string nombre = "Archivo";
  10.     stringstream ss;
  11.    
  12.     for( int i = 1; i<=3; i++){
  13.         ss << nombre << i <<".txt";
  14.         archivo.open( ss.str().c_str() );
  15.         archivo << "Empresa Los Animales";
  16.         archivo.close();
  17.         ss.str("");
  18.     }
  19.    
  20.  
  21.     return 0;
  22. }

Ese ejemplo te crea 3 archivos con el mismo nombre, pero con un numero distinto en cada uno de ellos. Uso el mismo puntero, al reutilizar el puntero hay que cerrar el archivo anterior para reutilizar el puntero nuevamente, si no cierras tendrás varios archivos abiertos y puede que los cambios efectuados no se produzcan, pero si los quieres tener abierto a todos podrías crear un array de punteros, luego al salir debes cerrarlos todos, depende para que lo quieres.
  #3 (permalink)  
Antiguo 28/09/2015, 03:34
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como creo un arhivo a partir de una variabe

Para abrir el archivo estás haciendo:

Código C++:
Ver original
  1. archivo.open("Empresa");

Como puedes apreciar, ofstream::open necesita un argumento, que es el nombre del fichero a abrir. El argumento en concreto debe ser de tipo char*. Eso lo puedes ver echando un vistazo a la documentación de la clase:

Código C++:
Ver original
  1. void open (const char* filename,  ios_base::openmode mode = ios_base::out);

Ese argumento se lo puedes pasar de forma fija (como en tu código), o usando una variable. Pues bien, tu lo que necesitas es hacer uso de la segunda opción.

¿Y cómo se pasa el nombre del fichero con una variable? La receta te la pongo a continuación:

Ingredientes:
  • Una variable de tipo char* de tamaño suficiente
  • strcpy para copias simples, strcat para concatenar cadenas, sprintf si el fichero puede tener números, ...

Preparación:
  • Almacena en la variable el nombre del fichero a abrir
  • Llama a ofstream::open pasando como argumento la variable que contiene el nombre del fichero

Dicho con un ejemplo:

Ver respuesta de vangodp

Nota: la respuesta de vangodp usa std::string en vez de char* para almacenar el nombre del fichero. Sin embargo, ofstream::open no espera recibir un std::string, sino un char*. Afortunadamente std::string dispone de un método llamado c_str() que te da acceso al char* que gestiona internamente.

La principal ventaja de usar std::string es que esta clase se encarga de garantizar que haya espacio suficiente para almacenar el nombre del fichero, lo que te permite despreocuparte de los problemas relacionados con la gestión de la memoria.

Un saludo
  #4 (permalink)  
Antiguo 28/09/2015, 15:53
 
Fecha de Ingreso: septiembre-2015
Mensajes: 9
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Como creo un arhivo a partir de una variabe

Quiero algo parecido a esto:

-Pedir cada dato de un cliente
nombre,id,sexo,dinero, etc...

Para luego poder consultar dichos datos de cada cliente y poder modificarlos, en Borland C++, se que esta obsoleto, pero debo hacerlo alli.
  #5 (permalink)  
Antiguo 28/09/2015, 16:13
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como creo un arhivo a partir de una variabe

pero eso lo puedes hacer con únicamente un fichero... lo que tienes que aprender es a manipular ficheros: cómo escribir en ellos, como leer su contenido, etc.

La forma concreta de hacer esto depende de la librería que uses... yo personalmente de borland no controlo mucho. Lo usé antes de entrar en la universidad para hacer mis pinitos, pero eso ya queda en el pasado.
  #6 (permalink)  
Antiguo 28/09/2015, 16:50
 
Fecha de Ingreso: septiembre-2015
Mensajes: 9
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Como creo un arhivo a partir de una variabe

Bueno, lo mas que me permiten hacerlo es en Dev.

Tengo este codigo, el cual me crea un archivo y va agregando los datos al final de cada uno, ya aprendi a manipularlos, me falta agregarle para que se muestren, luego lo agrego. Porque ahora mi duda es como hacer para que cuando termine de agregar un nuevo dato, me regrese al menu automaticamente?

Código C++:
Ver original
  1. #include <iostream>
  2. #include <fstream>
  3. #include <conio.h>
  4. #include <string.h>
  5. using namespace std;
  6. int opc;
  7. salidadatos(){
  8.     cout <<"En desarrollo";
  9. }
  10.  
  11. ingresardatos(){
  12.    
  13.     ofstream entrada; //Crear flujo llamado entrada
  14.     entrada.open("entrada.txt",ios::out|ios::app);
  15.     if(entrada.fail()){
  16.         cout <<"Error al crear el arhivo";
  17.         getch();   
  18.     }
  19.     else{
  20.         char nombrecurso[20];
  21.         float precio;
  22.         cout <<"Ingrese nombre del curso: ";
  23.         cin>>nombrecurso;
  24.         cout <<"Ingrese el precio del curso: ";
  25.         cin>>precio;
  26.         entrada<<nombrecurso<<" "<<precio<<endl;
  27.        
  28.         entrada.close();
  29.        
  30.         cout <<"Los datos fueron almacenados correctamente" <<endl;
  31.         system("pause");
  32.         system("cls");
  33.        
  34.     }
  35.     getch();
  36. }
  37.  
  38.  
  39. void menu() {
  40.  
  41. cout <<"1. Ingresar datos"<<endl;
  42. cout <<"2. Mostrar datos"<<endl;
  43. cout <<"3. Salir"<<endl;
  44. cout <<"Escoja una opcion: ";
  45. cin>>opc;
  46. system("cls");
  47. while(opc!=3){
  48.  
  49. switch(opc){
  50.     case 1: {ingresardatos();}
  51.         break;
  52.    
  53.     case 2:{salidadatos();}
  54.                 break;
  55.    
  56. }
  57. }
  58. }
  59.  
  60. int main() {
  61. menu();
  62.      
  63. }

Última edición por Escanter; 28/09/2015 a las 17:58
  #7 (permalink)  
Antiguo 29/09/2015, 01:08
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como creo un arhivo a partir de una variabe

Cita:
Iniciado por Escanter Ver Mensaje
Porque ahora mi duda es como hacer para que cuando termine de agregar un nuevo dato, me regrese al menu automaticamente?
Si el menú ha de aparecer varias veces entonces es que forma parte de un bucle...

Código C++:
Ver original
  1. do
  2. {
  3.   std::cout << /* opciones del menú */
  4.   cin>>opc;
  5.   system("cls");
  6.  
  7.   switch(opc){
  8.     case 1: {ingresardatos();}
  9.         break;
  10.    
  11.     case 2:{salidadatos();}
  12.                 break;
  13.   }
  14. }while(opc!=3);

De la forma en la que tu lo estás haciendo, no sólo no puedes repetir el menú sino que si introduces una opción válida (1-2) el programa entrará en un bucle sin fín, ya que opc SIEMPRE será distinto de 3 y no tendrás opción a cambiarlo.

Por cierto, "opc" no debería ser variable global. Evita el uso de las variables globales ya que son un caldo de cultivo perfecto para los errores del programa. En los programas que tu tengas que hacer mientras aprendes dudo muchísimo que te encuentres con la necesidad real de recurrir a las variables globales. Una variable global la mayoría de las veces indica problemas en el diseño del programa.

Un saludo.
  #8 (permalink)  
Antiguo 29/09/2015, 15:08
 
Fecha de Ingreso: septiembre-2015
Mensajes: 9
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Como creo un arhivo a partir de una variabe

Ohh ya, la verdad poco he usado el do while, voy a implementarlo mas de ahora en adelante, ya que es muy valioso. Si en ese caso me equivoque en usarla como global, las que si utilizo globales es cunado trabajo con matrices.

Saludos y Gracias!
  #9 (permalink)  
Antiguo 30/09/2015, 03:06
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como creo un arhivo a partir de una variabe

Cita:
Iniciado por Escanter Ver Mensaje
Ohh ya, la verdad poco he usado el do while, voy a implementarlo mas de ahora en adelante, ya que es muy valioso.
No olvides que en C++ hay varios tipos de bucles. Cada uno tiene su utilidad concreta y a la hora de elegir uno u otro debes tener en cuenta la legibilidad del código:

  • for: ideal para bucles con un número concreto de iteraciones o en los que la condición de finalización es simple
  • while: recomendado para bucles sin una finalización clara o con múltiples posibilidades para terminar.
  • do-while: Esta opción es la más recomendada si, además de lo comentado con while, la primera iteración es obligatoria.
Cita:
Iniciado por Escanter Ver Mensaje
Si en ese caso me equivoque en usarla como global, las que si utilizo globales es cunado trabajo con matrices.
¿Y por qué motivo las matrices han de ser variables globales? Nada te impide pasarlas como argumento a las funciones.

Un saludo
  #10 (permalink)  
Antiguo 30/09/2015, 13:11
 
Fecha de Ingreso: septiembre-2015
Mensajes: 9
Antigüedad: 8 años, 7 meses
Puntos: 0
Respuesta: Como creo un arhivo a partir de una variabe

Cita:
Iniciado por eferion Ver Mensaje


¿Y por qué motivo las matrices han de ser variables globales? Nada te impide pasarlas como argumento a las funciones.

Un saludo
Porque, hice un programa con un menu, en el cual hay 4 opciones:
Sumar, Restar, Multiplicarlas y la transpuesta.

Por ejemplo tengo las variables matA[50][50] MatB[50][50] MatC[50][50] i,j es mas facil declararlas como globales, ya que las usare en diferentes funciones no? que estar poniéndolas en cada función pienso yo
  #11 (permalink)  
Antiguo 01/10/2015, 01:10
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Como creo un arhivo a partir de una variabe

el problema que tienen las variables globales es que no tienes control sobre ellas... se pueden modificar en cualquier parte del programa sin que tú puedas controlarlo.

Si eso ya llega a ser caótico imagínate si le un entorno multi-hilo, entonces ya el cacao que se va a montar es para borrar el programa completo y empezar de nuevo.

Usar parámetros en vez de variables globales tiene varias ventajas:

  • Controlas en todo momento quién tiene acceso a las variables
  • Es más sencillo implementar entornos multitarea.
  • Las funciones son reutilizables (si tu haces una función que sume dos matrices y éstas son globales, ¿qué pasa si quieres hacer D=A+B+C? te toca reemplazar las variables globales con sumo cuidado, mientras que si son argumentos basta con ir haciendo llamadas a la función)
  • El código es más seguro y fácil de mantener
  • Las variables globales tienen el problema de que pueden colisionar (tener el mismo nombre) con otras variables globales/locales... en tal caso el programa usará una de las dos y seguramente no sea la que tú esperas.
Creo que queda claro que las variables globales no son una buena opción.


Un saludo.
  #12 (permalink)  
Antiguo 01/10/2015, 11:46
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Como creo un arhivo a partir de una variabe

Cita:
Iniciado por eferion Ver Mensaje
el problema que tienen las variables globales es que no tienes control sobre ellas... se pueden modificar en cualquier parte del programa sin que tú puedas controlarlo.

Si eso ya llega a ser caótico imagínate si le un entorno multi-hilo, entonces ya el cacao que se va a montar es para borrar el programa completo y empezar de nuevo.

Usar parámetros en vez de variables globales tiene varias ventajas:

  • Controlas en todo momento quién tiene acceso a las variables
  • Es más sencillo implementar entornos multitarea.
  • Las funciones son reutilizables (si tu haces una función que sume dos matrices y éstas son globales, ¿qué pasa si quieres hacer D=A+B+C? te toca reemplazar las variables globales con sumo cuidado, mientras que si son argumentos basta con ir haciendo llamadas a la función)
  • El código es más seguro y fácil de mantener
  • Las variables globales tienen el problema de que pueden colisionar (tener el mismo nombre) con otras variables globales/locales... en tal caso el programa usará una de las dos y seguramente no sea la que tú esperas.
Creo que queda claro que las variables globales no son una buena opción.


Un saludo.
Además si tienes una variable global y luego en una funcion declaras una variable con el mismo nombre usará la de la función pero si por ejemplo por error borras la declaración de la de la función no obtendras ningún error y es complejo dar con fallos así ya que al modificar su valor en tu función el resto del programa puede funcionar de forma inestable. Y como dice eferion, si usas varios hilos ya es el caos absoluto.
La única pega que le puedo sacar a usar parámetros es que repercute en los tiempos de ejecución pero es tan ínfimo que se notaría en el rendimiento de uso de fuerza bruta y cosas así.

Etiquetas: int, programa
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 12:01.