[ Foro de C++ ]

Fallo de Segmentacion

07-Jan-2014 19:06
Miguel Valenciano
12 Respuestas

Hola estoy realizando un programa que guarda distinta informacion en un fichero sobre los tipos de particulas subatomicas. No llevo mucho de programa y estoy atascado a la hora de introducir los datos por teclado. Tal y como dice el asunto mi mayor problema es que me compila pero a la hora de ejecutarlo en la ultima accion falla.(lo he comprobado con el debuger).



07-Jan-2014 19:10
Miguel Valenciano


 
#include <iostream>
#include <string>
#include <fstream>
#define TAM 500
 
using namespace std ;
 
struct particula
{
       string nombre , familia , grupo , pais , generacion , simbolo ;
       float masa , carga ;
       short spin , anio ;
 
} ;
 
void LeerFichero ( particula vector [TAM] , int & i ) ;
particula DatosNuevaParticula() ;
int buscar ( particula vector[TAM], string nombre, int & i ) ;
int Numerofichas ( particula vector [TAM] , int & i ) ;
 
void LeerFichero ( particula vector [TAM] , int & i )
{
     bool error = false ;
 
 
     i = 0 ;
 
     fstream f("particulas.txt", ios::in | 
      ios::out | ios::trunc | ios::binary);
 
     if (!f)
            error = true ;
     else
     {
         while ( getline( f , vector[i].nombre ) )
         {
               getline( f , vector[i].simbolo ) ;
               f >> vector[i].masa  ;
               f >> vector[i].carga ;
               f >> vector[i].spin ;
               f.ignore () ;
               getline( f , vector[i].familia , '\t' ) ;
               getline( f , vector[i].grupo , '\t' ) ;
               getline( f , vector[i].generacion ) ;
               getline( f , vector[i].pais ) ;
               f >> vector[i].anio ;
 
               i++ ;
         }
     } 
     f.close() ;
}
 
int Numerofichas ( particula vector [TAM] , int & i )
{
     bool error = false ;
 
 
     i = 0 ;
 
     fstream f("particulas.txt", ios::in | 
      ios::out | ios::trunc | ios::binary);
 
     if (!f)
            error = true ;
     else
     {
         while ( getline( f , vector[i].nombre ) )
         {                
               i++ ;
         }
     } 
     return i ;
     f.close() ;
}
 
particula DatosNuevaParticula()
{
      particula p ;
      string pais ; 
 
          cout << "Simbolo: " ;
          cin >> p.simbolo ;
 
          do
          {
          cout << "Masa: " ;
          cin >> p.masa ;
          }
          while (p.masa < 0 ) ;
 
          cout << "Carga: " ;
          cin >> p.carga ;
 
          do 
          {
          cout << "Spin: " ;
          cin >> p.spin ;
          }
          while ( p.spin < 0 ) ;
 
          cout << "Familia: " ;
          cin >> p.familia ;
 
          cout << "Grupo: " ;
          cin >> p.grupo ;
 
          do
          {
          cout << "Introduce la generacion en numeros romanos (si la desconoces" << endl ;
          cout << " introduce una interrogacion '?' ) : " ;
          cin >> p.generacion ;
          }
          while ( (p.generacion != "i") && (p.generacion != "ii") && (p.generacion != "iii" ) && ( p.generacion != "?" ) ) ;
          if ( p.generacion == "?" )
          {
               p.generacion = "Desconocida" ;
          }
 
          cout << "Pais de descubrimiento (si lo desconoces escribe un cero en " << endl ;
          cout << " el campo) : " ;
          cin >> pais ;
          if ( p.pais == "0" )
          {
               p.pais = "Desconocido" ;
          }
 
          do
          {
          cout << "Anio de descubrimiento (si lo desconoces escribe '-1') : " ;
          cin >> p.anio ;
          } 
          while ( p.anio < -1 ) ;
 
      return p ;   
 
}
 
int buscar ( particula vector[TAM], string nombre, int & i )
{
     int j , encontrado ;
     j = 0;
     encontrado = -1;
     while ( j < i && vector[j].nombre != nombre )
     {
           j++ ;
     }
     if ( j != i )
     {
          encontrado = j ;
     }
 
     return (encontrado) ;
}
 
particula NombreNuevaParticula()
{
          particula p ;
          string nombre ;
          int i , j , encontrado , contador ;
          particula vector[TAM] ;
 
          contador = Numerofichas ( vector , j ) ;
 
          cout << "Nombre: " << endl ;
          cin >> nombre ;
 
          encontrado = buscar (vector , nombre , contador ) ;
 
          if ( encontrado != -1 )
          {
               cout << "Nombre ya en el catalogo." << endl ;
          }
          else
          {
               p.nombre = nombre ;
               DatosNuevaParticula() ;
          }
 
 
}
 



07-Jan-2014 19:13
Miguel Valenciano

El fallo está supuestamente en las funciones "particula DatosNuevaParticula" y en "particula NombreNuevaParticula"


07-Jan-2014 19:40
Nacho Cabanes (+31)

Veamos...

Por una parte, al compilarlo me da varios "warning" que deberías tener en cuenta:

- En la línea 181 avisa de que "particula NombreNuevaParticula" no está devolviendo ningún dato (y eso suena peligroso).

- En la línea 160, dentro de esa misma función, declaras una variable "i" que no usas (poco peligroso, se supone)

- En la línea 75, hay un "return" antes de cerrar el fichero, de modo que nunca lo cerrarás.

- No da warning, pero "Numerofichas" devuelve un valor por referencia y a la vez con return (¿por qué lo haces?)

Por otra parte, no hay ningún "main", así que no puedo probarlo y necesitaría saber la línea exacta que está fallando para intentar "deducir" qué puede tener incorrecto. Esa(s) línea(s) exacta(s) las puedes descubrir con el depurador o añadir algunos "cout" adicionales para saber por dónde pasa tu programa y dónde no llega a entrar. Sin saber la línea exacta que detiene el programa, es muchísimo más laborioso encontrar de dónde proviene ese fallo.


07-Jan-2014 19:58
Miguel Valenciano

El main no lo he puesto porque era larguillo, te lo dejo a continuación ( y asi veis lo que es my idea del programa). Voi a ver los que me has comentado, pero la verdad es que esta bastante cogido con pinzas.
En principio puse un return p , pero me saltaba bastante antes el problema de segmentacion.

La variable i basicamente es que se me ha pasado borrarla.

La verdad es que no me he dado cuenta en ese detalle. XD

El return de la funcion NumeroFichas, lo uso para que me devuelva el numero de particulas en el fichero y asi poder usarlo a la hora de comparar si un nombre esta ya en el ficharo en la funcion buscar dentro de la funcion NombreNuevaParticula.  

 
int main()
{
    char opcion , save ;
    particula vector[TAM] ;
    int contador ;
 
    LeerFichero( vector , contador ) ;
 
 
    cout << "Este programa cataloga las distintas particulas elementales " << endl ;
    cout << "descubiertas hasta la fecha." << endl ;
    cout << "En el se almacena informacion de cada poarticula, como el nombre, " << endl ;
    cout << "el simbolo, la masa, etc..." << endl ;
    cout << "Dame el nombre del fichero: " << endl ;
 
 
    cout << "El programa relaiza las siguientes operaciones: " << endl ;
    cout << "0) Salir. " << endl ;
    cout << "1) Crear nueva ficha. " << endl ;
    cout << "2) Listar ficheros. " << endl ;
    cout << "3) Modificar datos de una ficha. " << endl ;
    cout << "4) Borrar ficha. " << endl ;
    cout << "5) Buscar una ficha. " << endl ;
    cout << "          a) Buscar por nombre que contentas las palabras..." << endl ;
    cout << "          b) Buscar las que tengarn masa inferior a..." << endl ;
    cout << "          c) Buscar por mas y spin..." << endl ;
    cout << "          d) Mostrar particulas de una generacion. " << endl ;
    cout << "          e) Mostrar partículas de una familia y grupo." << endl ;
    cout << "6) Estadíscticas: " << endl ;
    cout << "          a)Numero de particulas descubiertas en un periodo de anios. " << endl ;
    cout << "          b)% de particulas descubiertas por pais. " << endl ;
 
    do
    {
    cin >> opcion ;
 
        switch (opcion)
        { 
               //INTRODUCE NUEVAS PARTICULAS
               case '1' :
                    NombreNuevaParticula() ;
                    break ;
 
               //MUESTRA LAS PARTICULAS
               case '2' :
                    break ;
 
               //MODIFICA DATOS DE UNA PARTICULA
               case '3' :
                    break ;
 
               //bORRA UNA PARTICULA
               case '4' : 
                    break ;
 
               //bUSQUEDA DE PARTICULAS
               case '5' : 
                    break ;
 
               //MUESTRA LAS ESTADISTICAS
               case '6' :
                    break ;
        }      
 
    }
    while( opcion != 0 ) ;
 
    do
    {
        cout << "¿Quieres guardar los cambios? " << endl ;
        cout << "1)---> Si." << endl ;
        cout << "2)---> No." << endl ;
 
        cin >> save ;
 
        switch ( save )
        {
              //GUARDA LOS CAMBIOS
              case '1' :
 
                    break ;
              case '2' :
                    system ("pause") ;
                    return 0 ;
                    break ;
        }
    }
      while ( save != '1' && save!= '2' ) ;
 
system("pause") ;
return 0 ;
}
 



07-Jan-2014 20:25
Miguel Valenciano

Bueno, acabo de cambiar lo que me has comentado Nacho y se ha solucionado el problema, llevabas razón en todo.
Muchas Gracias.

PD: Ya que estoy, me gustaría que en la funcion "particula DatosNuevaParticula" en la linea 120, en lugar de introducir un cero si se deconoce el dato, se pueda dejar en blanco. Estuve buscando y encontré la función "isspace", pero no me llegó a funcionar correctamente (creo que debido a que la variable es un string), ¿habría otra manera de conseguirlo?


07-Jan-2014 20:38
Nacho Cabanes (+31)

No es lo mismo "dejar en blanco" que "introducir un espacio en blanco". La función "isspace" es de C, no de C++, se aplica a un único carácter, y dice si es un espacio, de modo que no es lo que necesitas.

En tu caso, deberías decir al usuario que pulse Intro (sin teclear nada) y entonces comprobarías si es una cadena vacía ("") o si su longitud es 0.

Como curiosidad (pero insisto: no te sirve en este caso), aquí tienes la referencia de "isspace":

http://aprendeaprogramar.com/referencia/view.php?f=isspace&leng=C

Y aquí tienes los apuntes de cadenas en C++, con cosas como el ".length()" para saber la longitud:

http://aprendeaprogramar.com/mod/resource/view.php?id=494


07-Jan-2014 21:09
Miguel Valenciano

Gracias por la info, he usado el comado ".length()", pero sin embargo, no me coge el dato cuando pulso "enter".

 
cout << "Pais de descubrimiento (si lo desconoces pulsa enter: "  << endl ;
 
          cin >> pais ;
          i = pais.length() ;
          if ( i == 0 )
          {
               p.pais = "Desconocido" ;
          }
          else
          {
              p.pais = pais ; 
          }
 


Uso la variable i para saber lo que vale pais.length() con el debuger. ¿Hace falta algún comando especial para que coja el intro?


07-Jan-2014 23:38
Nacho Cabanes (+31)

Yo juraría que "cin" te sigue pidiendo datos si pulsas Intro sin introducir nada. Debes introducir una palabra (y no deberá contener espacios)

Si quieres que te permita cadenas más generales (como cadenas con espacios intermedios y cadenas vacías), deberás usar "getline". En ese caso, podrás comparar con una cadena vacía, o usar "length" para ver si tiene longitud 0, o "empty" para ver si está vacía:

 
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string texto;
 
    cout << "Escribe algo: ";
    getline(cin,texto);
    cout << "Su longitud es " <<  texto.length() << endl;
    cout << "Está vacío? " <<  texto.empty() << endl;
    cout << "Es cadena vacía? " <<  (texto == "") << endl;
 
    return 0;
}
 



08-Jan-2014 18:07
Miguel Valenciano

Muchas gracias porla info de nuevo. La verdad es ya me da palo seguir pregúntandote cosas, sin embargo tengo un problema a la hora de rescribir el fichero con los datos cargados en memoria y me resultaría de gran ayuda si me dieras tu opinion.
Este sería el modelo de fichero:

 
electron
e
 
123	+1	1
Fermiones	Leptones	i
Reino Unido
1896
Proton
p
 
321	-1	3
Bosones	Gauge	?
 
-1
 


Para rescribirlo uso la funcion EscribirFichero (linea 279) guiandome con http://www.aprendeaprogramar.com/mod/resource/view.php?id=496

 
#include <iostream>
#include <string>
#include <fstream>
#define TAM 500
 
using namespace std ;
 
struct particula
{
       string nombre , familia , grupo , pais , generacion , simbolo ;
       float masa , carga ;
       short spin , anio ;
 
} ;
 
int LeerFichero ( particula vector [TAM] ) ;
particula DatosNuevaParticula() ;
int buscar ( particula vector[TAM], string nombre, int & i ) ;
void mostrar ( particula vector[TAM] ) ;
void EscribirVector( particula vector [TAM] )  ;
void EscribirFichero( particula vector[TAM] , int & n ) ;
void Menu () ;
 
int LeerFichero ( particula vector [TAM] )
{
     bool error = false ;
     int i ;
 
     i = 0 ;
 
     fstream f("particulas.txt", ios::in | 
     ios::out | ios::binary );
 
     if (!f)
     {
            fstream f("particulas.txt", ios::in | 
            ios::out | ios::trunc  | ios::binary) ;
 
            while ( getline( f , vector[i].nombre ) )
            {
                  getline( f , vector[i].nombre ) ;
                  getline( f , vector[i].simbolo ) ;
                  f >> vector[i].masa  ;
                  f >> vector[i].carga ;
                  f >> vector[i].spin ;
                  f.ignore () ;
                  getline( f , vector[i].familia , '\t' ) ;
                  getline( f , vector[i].grupo , '\t' ) ;
                  getline( f , vector[i].generacion ) ;
                  getline( f , vector[i].pais ) ;
                  f >> vector[i].anio ;
                  f.ignore () ;
 
                  i++ ;
             }
      }
      else
      {
         while ( getline( f , vector[i].nombre ) )
         {
 
               getline( f , vector[i].nombre ) ;
               getline( f , vector[i].simbolo ) ;
               f >> vector[i].masa  ;
               f >> vector[i].carga ;
               f >> vector[i].spin ;
               f.ignore () ;
               getline( f , vector[i].familia , '\t' ) ;
               getline( f , vector[i].grupo , '\t' ) ;
               getline( f , vector[i].generacion ) ;
               getline( f , vector[i].pais ) ;
               f >> vector[i].anio ;
               f.ignore () ;
 
               i++ ;
          }
      } 
     f.close() ;
     return i ;
}
 
 
 
particula DatosNuevaParticula()
{
      particula p ;
      string pais ; 
 
          cout << "Simbolo: " << endl  ;
          cin >> p.simbolo ;
 
          do
          {
          cout << "Masa: " << endl  ;
          cin >> p.masa ;
          }
          while ( p.masa < 0 ) ;
 
          cout << "Carga: " << endl  ;
          cin >> p.carga ;
 
          do 
          {
          cout << "Spin: " << endl  ;
          cin >> p.spin ;
          }
          while ( p.spin < 0 ) ;
 
          cout << "Familia: " << endl  ;
          cin >> p.familia ;
 
          cout << "Grupo: " << endl  ;
          cin >> p.grupo ;
 
          do
          {
          cout << "Introduce la generacion en numeros romanos (si la desconoces" << endl ;
          cout << " introduce una interrogacion '?' ) : " ;
          cin >> p.generacion ;
          cin.ignore() ;
          }
          while ( (p.generacion != "i") && (p.generacion != "ii") && (p.generacion != "iii" ) && ( p.generacion != "?" ) ) ;
 
          cout << "Pais de descubrimiento (si lo desconoces escribe pulsa intro " << endl ;
          cout << " el campo) : "<< endl  ;
          getline(cin, pais ) ;
          if ( pais.length() == 0 && pais.empty()== 1 && pais == "" )
          {
               p.pais = "Desconocido" ;
          }
          else
          {
              p.pais = pais ; 
          }
 
          do
          {
          cout << "Anio de descubrimiento (si lo desconoces escribe '-1') : " << endl ;
          cin >> p.anio ;
          cin.ignore() ;
          } 
          while ( p.anio < -1 ) ;
 
      return p ;   
 
}
 
 
 
particula NombreNuevaParticula()
{
          particula p ;
          string nombre ;
          int encontrado , contador ;
          particula vector[TAM] ;
 
          contador = LeerFichero ( vector  ) ;
 
          cout << "Nombre: " << endl ;
          cin >> nombre ;
 
          encontrado = buscar (vector , nombre , contador ) ;
 
          if ( encontrado != -1 )
          {
               cout << "Nombre ya en el catalogo." << endl ;
          }
          else
          {
               p.nombre = nombre ;
               DatosNuevaParticula() ;
               EscribirVector(vector) ;
          }
 return p ;
}
 
int buscar ( particula vector[TAM], string nombre, int & i )
{
     int j , encontrado ;
     j = 0;
     encontrado = -1;
     while ( j < i && vector[j].nombre != nombre )
     {
           j++ ;
     }
     if ( j != i )
     {
          encontrado = j ;
     }
 
     return (encontrado) ;
}
 
void Mostrar ( particula vector[TAM] )
{
     int i , contador ;
 
     i = 0 ;
 
     contador = LeerFichero ( vector ) ;
 
     do
     {
              cout << "Nombre: " ;
              cout << vector[i].nombre << endl;
 
              cout << "Simbolo: " ;
              cout << vector[i].simbolo << endl ;
 
              cout << "Masa: " ;
              cout << vector[i].masa << endl ;
 
              cout << "Carga: " ;
              cout << vector[i].carga << endl ;
 
              cout << "Spin: " ;
              cout << vector[i].spin << endl ;
 
              cout << "Familia: " ;
              cout << vector[i].familia << endl ;
 
              cout << "Grupo: " ;
              cout << vector[i].grupo << endl ;
 
              cout << "Generacion: " ;
              if ( vector[i].generacion != "i" && vector[i].generacion != "ii" && vector[i].generacion != "iii" )
              {
                   cout << "Desconocida" << endl ;
              }
              else
              {
                   cout << vector[i].generacion << endl ;
              }
 
              cout << "Pais: " ;
              cout << vector[i].pais << endl ;
              if ( vector[i].pais.length() == 0 || vector[i].pais.empty()== 1 || vector[i].pais == "" )
              {
                 cout << "Desconocido" << endl ;
              }
 
              cout << "Anio: " ;
              if ( vector[i].anio == -1 )
              {
                   cout << "Desconocido" << endl ;
              }
              else
              {
                   cout << vector[i].anio << endl ;
              }
 
          i++ ;
     }
     while( i < contador ) ;
 
     system("pause") ;
 
}
 
void EscribirVector( particula vector [TAM] ) 
{
     int i , tam ;
     particula p ;
     tam = LeerFichero( vector ) ;
 
    for ( i = tam ; i<= (tam+1) ; i++ )
    {
        vector[i].nombre = p.nombre ;
        vector[i].simbolo = p.simbolo ;
        vector[i].masa = p.masa ;
        vector[i].carga = p.carga ;
        vector[i].spin = p.spin ;
        vector[i].familia = p.familia ;
        vector[i].grupo = p.grupo ;
        vector[i].generacion = p.generacion ;
        vector[i].pais = p.pais ; 
        vector[i].anio = p.anio ;
    }
}
 
void EscribirFichero( particula vector[TAM] , int & n )
{
 
     int i , tam ;
     // Obtengo el numero de particulas antes de rescribirlo
     tam = LeerFichero( vector ) ;
     // Lo borro
     fstream f("particulas.txt", ios::in | 
     ios::out | ios::trunc ) ;
 
     // Creo un bucle que me recorre todo el vector onde estan cargados los datos
     // para que me los escriba en el fichero( la n el el numero de fichas que se
     // han incluido 
     for ( i = 0 ; i<= tam+n  ; i++ )
     {
          f << vector[i].nombre << endl ;
          f << vector[i].simbolo << endl ;
          f << endl ;
          f << vector[i].masa << "\t" ;
          f << vector[i].carga << "\t" ;
          f << vector[i].spin << endl ;
          f << vector[i].familia << "\t" ;
          f << vector[i].grupo << "\t" ;
          f << vector[i].generacion << endl ;
          f << vector[i].pais << endl ; 
          f << vector[i].anio << endl ;
     }
     f.close() ;
}
 
 
void Menu ()
{
     cout << "ELIJA OTRA OPCION. " << endl ;
     cout << "0) Salir. " << endl ;
     cout << "1) Crear nueva ficha. " << endl ;
     cout << "2) Listar fichas. " << endl ;
     cout << "3) Modificar datos de una ficha. " << endl ;
     cout << "4) Borrar ficha. " << endl ;
     cout << "5) Buscar una ficha. " << endl ;
     cout << "          a) Buscar por nombre que contentas las palabras..." << endl ;
     cout << "          b) Buscar las que tengarn masa inferior a..." << endl ;
     cout << "          c) Buscar por mas y spin..." << endl ;
     cout << "          d) Mostrar particulas de una generacion. " << endl ;
     cout << "          e) Mostrar partículas de una familia y grupo." << endl ;
     cout << "6) Estadíscticas: " << endl ;
     cout << "          a)Numero de particulas descubiertas en un periodo de anios. " << endl ;
     cout << "          b)% de particulas descubiertas por pais. " << endl ;
}
 
int main()
{
    char opcion , save ;
    particula vector[TAM] ;
    int n ;
 
    n = 0 ;
 
    LeerFichero( vector ) ;
 
 
    cout << "Este programa cataloga las distintas particulas elementales " << endl ;
    cout << "descubiertas hasta la fecha." << endl ;
    cout << "En el se almacena informacion de cada poarticula, como el nombre, " << endl ;
    cout << "el simbolo, la masa, etc..." << endl ;
 
    Menu () ;
 
    do
    {
    cin >> opcion ;
 
        switch (opcion)
        { 
               //INTRODUCE NUEVAS PARTICULAS
               case '1' :
                    NombreNuevaParticula() ;
                    cout << ">>Ficha guardada correctamente." << endl ;
                    cout << endl ;
                    n++ ;
                    Menu ();
                    break ;
 
               //MUESTRA LAS PARTICULAS
               case '2' :
                    Mostrar (vector) ;
                    cout << endl ;
                    Menu () ;
                    break ;
 
               //MODIFICA DATOS DE UNA PARTICULA
               case '3' :
                    break ;
 
               //BORRA UNA PARTICULA
               case '4' : 
                    break ;
 
               //BUSQUEDA DE PARTICULAS
               case '5' : 
                    break ;
 
               //MUESTRA LAS ESTADISTICAS
               case '6' :
                    break ;
        }      
 
    }
    while( opcion != '0' ) ;
 
    do
    {
        cout << "¿Quieres guardar los cambios? " << endl ;
        cout << "1)---> Si." << endl ;
        cout << "2)---> No." << endl ;
 
        cin >> save ;
 
        switch ( save )
        {
              //GUARDA LOS CAMBIOS
              case '1' :
EscribirFichero(  vector , n ) ;
                    break ;
              case '2' :
                    system ("pause") ;
                    return 0 ;
                    break ;
        }
    }
      while ( save != '1' && save!= '2' ) ;
 
system("pause") ;
return 0 ;
}
 


PD: No estoy seguro de si me combiene usar las funciones " NombreNuevaParticula()"(linea148) y  "DatosNuevaParticula()"(linea 82) para luego usar la funcion " EscribirVector( particula vector [TAM] )"(linea 258) dentro de la funcion "NombreNuevaParticula()" (linea 170). Es decir, me interesa guardar los datos en particula para luego pasarlo al vector, la verdad es que no me queda del todo claro.



08-Jan-2014 20:06
Nacho Cabanes (+31)

Haces algunas cosas un tanto raras... y bastante peligrosas. Por ejemplo:

- Es peligroso escribir datos separados por tabulaciones. Es mucho más simple procesarlos si está cada dato en una línea. Eso es lo que yo haría, al menos en una primera versión del programa. Si te obligan a que estén separados por tabulaciones, deja eso para una mejora posterior, cuando compruebes que consigues guardar y leer datos un poco más simples.

- Siempre abres para lectura y escritura simultánea, algo que no tiene sentido en un fichero de texto.

- Al leer, dices que vas a leer datos binarios (!!!), pero al escribir los estás guardando como texto puro.

- LeerFichero devuelve un número, pero no lo utilizas cuando lo llamas desde Main.

- No entiendo para qué necesitas "trunc": basta con hacer una lectura (sólo lectura) para tomar los datos y una escritura (sólo escritura, sin añadir al final del fichero) para guardarlos. Te estás complicando mucho con los modos de apertura de fichero, cuando sería mucho más sencillo usar "ifstream" para leer y "ofstream" para escribir.


08-Jan-2014 20:33
Miguel Valenciano

Hola gracias por responderme, en cuanto a lo que me has comentado:

- Probare a hacerlo primero sin tabulaciones, pero de hecho, cuando intento guardar una nueva particula, las posiciones de los nuevos datos son correctas, el problema es que aparecen como ceros posiblemente porque no guarde bien los datos en el vector, he ahí mi pregunta de la postdata en mi post anterior.
A parte de eso, el unico problema es que se me borra la primera linea y la sustituye por la segunda quedandose el simbolo, dos renglones en blanco y el resto de los datos, pero bueno, eso supongo que se solucionara relativamente facil.

- Eso lo hice porque encontre esa manera de abrirlo en internet y me daba cosa cambiarlo, pero una vez lo lees te das cuenta que es una tonteria tal y como dices.

- Lo mismo que el punto anterior.

-  El "::trunc" lo usaba para crear otra vez el fichero, pero supongo que el ofstream será mejor.


08-Jan-2014 20:36
Miguel Valenciano

*- El numero que devuelve "LeerFichero" es para saber el numero de particulas en el fichero.Lo uso en la funcion "EscribirFichero"(linea 280).






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)