Programa con Archivo ".txt" y un problema a la hora de Salida de Datos

Iniciado por Black Lotus, 14 Noviembre 2013, 07:48 AM

0 Miembros y 2 Visitantes están viendo este tema.

Black Lotus

Hola a todos solo quería contarles mi caso... Nos dejaron un programa de Automatas, trata de que el usuario ingrese una tabla de transición y que en ella muestre los estados que se desea incluir en la cadena final(la llamo así porque no me acuerdo de él nombre real que debería llevar  :¬¬ :¬¬  :¬¬ ) y de paso me tiene que guardar todas las cadenas que vaya generando el programa en un archivo ".txt"... Logro que guarde en un archivo, sin embargo a la hora de tratar de mostrar datos por pantalla me genera un error... Aca el codigo que llevo hasta ahora... el codigo lo he tratado de hacer yo sin ayuda de ninguna pagina hasta ahora que pido me den la idea de porque me da este error y si me ayudan les agradezco...

Código (cpp) [Seleccionar]

include <iostream>
#include <fstream>
#include <string>


int Proceso();
void Centra_Titulo();
void mostrar();


int Proceso()
{
int lim;
int contador;
  int di[100];
  int df[100];

  ofstream abrir_datos;
  abrir_datos.open("Transiciones.txt", ios::out|ios::app);
  if(abrir_datos.fail())
  {
  cerr>"Error Al Crear Archivo";
  cin.get();
cin.get();
  }
  else
  {

cout<<"Cuantos estados desea ingresar: ";
  cin>>lim;

  for(contador=0; contador<lim; contador++)
  {
        cout<<"Ingrese los datos correspondientes al Estado No. "<<(contador+1)<<" ..."<<endl;
        cout<<"q";cin>>di[contador];
        cout<<"q";cin>>df[contador];
        abrir_datos<<di[contador]<<" "<<df[contador]<<endl;

  }


  cout<<"La expresion de transiciones es: "<<endl;
  cout<<"{ ";
    for(contador=0; contador<lim; contador++)
  {
        cout<<" q";cout<<di[contador]<<" ==>";
        cout<<" q";cout<<df[contador];
        if(contador<lim-1)
        {
        cout<<" | ";
        }

  }
        cout<<" }";
   abrir_datos.close();
   }
}

void mostrar()
{
int lim;

int contador;
  int di[100];
  int df[100];

  ifstream abrir_datos;
  abrir_datos.open("Transiciones.txt",ios::in|ios::app);

  abrir_datos>>di[contador];
  while (!abrir_datos.eof())
  {
  abrir_datos>>df[contador];
  for(contador=0; contador<lim; contador++)
  {
        cout<<" q";cout<<di[contador]<<" ==>";
        cout<<" q";cout<<df[contador];
        if(contador<lim-1)
        {
        cout<<" | ";
        }

  }
        cout<<" }";
        abrir_datos>>di[contador];
   }
   abrir_datos.close();

}



void Centra_Titulo()
{
  char  titulo[100]= "Bienvenido al Programa De Automatas Deterministas" ;

  int pro = strlen(titulo);
  for (int i=1; i<(40-(pro/2)); i++)
  cout<<" ";
  cout<<titulo;
}


int main ()
{
  int cantidad;
  int opc;
  Centra_Titulo();
     cout<<endl<<endl;
cout<<"1. Ingreso de Datos"<<endl;
cout<<"2. Mostrar todas las Expresiones desarrolladas"<<endl;;
cout<<"3. Salir"<<endl;
cout<<"Que desea hacer: ";
     cin>>opc;

     switch(opc)
     {
     case 1:
     Proceso();
     break;

     case 2:
     mostrar();
     break;
     }

cin.get();
cin.get();
return 0;
}


Pienso que el problema es esta linea de código de la funcion "mostrar":
Código (cpp) [Seleccionar]
  for(contador=0; contador<lim; contador++)
  {

debido a que allí no ingreso el valor de la variable "lim" como en la funcion proceso, pero igual puede que no sea allí el problema y me lo este imaginando....


PD: Estoy trabajando en Borland C++

BlackM4ster

Antes de hacer nada, tienes que dar valor a
Código (c++) [Seleccionar]
int lim;
int di[100];
int df[100];


Para ello, tienes que hacer un for, que vaya leyendo lo que hay entre espacio y espacio de los archivos, y vaya almacenandolo. Un contador te ayudará a saber cuantos datos tiene que leer (lim)

Suerte
- Pásate por mi web -
https://codeisc.com

rir3760

Cita de: Black Lotus en 14 Noviembre 2013, 07:48 AMsin embargo a la hora de tratar de mostrar datos por pantalla me genera un error...
Si solo quieres mostrar las lineas en el archivo puedes utilizar la función getline. Por ejemplo:
Código (cpp) [Seleccionar]
void mostrar()
{
   ifstream abrir_datos;
   char linea[4096]; // O algun otro valor apropiado
   
   abrir_datos.open("Transiciones.txt",ios::in|ios::app);
   
   while (abrir_datos.getline(linea, 4096))
      cout << linea << endl;

   abrir_datos.close();
}


Una forma mejor es utilizando la clase string y std::getline.

Por ultimo deberías de cambiar de compilador ya que los Borland, para ser diplomático, no tienen una buena reputación.

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

Black Lotus

Cita de: rir3760 en 14 Noviembre 2013, 18:39 PM
Por ultimo deberías de cambiar de compilador ya que los Borland, para ser diplomático, no tienen una buena reputación.


Me recomiendas algun compilador de c++?? que tenga una buena reputación  ;D ;D

rir3760

Dos de calidad son g++ (parte de GCC y disponible para MS Windows y Linux) y Visual C++ de Microsoft.

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