[C con Clase] Segmentation Fault a la hora de leer un archivo

Steven Davidson srd4121 en njit.edu
Mar Abr 3 03:06:12 CEST 2012


Hola Asdrúbal,

On 4/2/2012 3:08 PM, Asdrúbal Iván Suárez Rivera wrote:
>
>
> Al hacer el quicksort me sigue dando error, pareciera una recursión
> infinita :( por la violación de segmento.
>
> Mando el código para que vean.
>

El problema de lo que he visto está en el fichero entrante, 
"QuickSort.txt" que está lleno de caracteres que representan dígitos, 
pero no necesariamente representan números. En la funcuión 'leer()', al 
hacer esto,

int temp;
string linea;
...
if( getline(archivo,linea) )

La cadena, 'linea', prácticamente guarda TODO el contenido del fichero. 
Posteriormente, ejecutas estas sentencias:

istringstream ss( linea, stringstream::in | stringstream::out );
ss >> temp;
ret_val.push_back( temp );

La operación: ss >> temp  implica que conviertes TODO el contenido a un 
entero. Sin embargo, es imposible realizar tal conversión, por las 
limitaciones de 'int' y de cualquier otro tipo de entero en C++.

El otro problema es que tienes un bucle 'while', en 'leer()', basado en 
'archivo.good()'. Sin embargo, esta condición no es suficiente, ya que 
nos interesa terminar cuando lleguemos al final del fichero. Por lo 
tanto, las sentencias deberían ser,

getline( archivo, linea );
while( !archivo.eof() )
{
   istringstream ss( linea );
   ss >> temp;
   ret_val.push_back( temp );

   getline( archivo, linea );
}

Necesitamos realizar una lectura y luego comprobar si hemos llegado al 
final del fichero.

Otro error que veo está en la recursividad indirecta que realizas entre 
'quicksort()' y 'mediana()', ya que cada una invoca a la otra, lo cual 
provoca la invocación a sí misma que conlleva a la invocación de la otra 
función, y así sucesivamente.

Esto no tiene ningún sentido, en mi opinión, especialmente el hecho de 
que 'mediana()' tenga que invocar a 'quicksort()'. La mediana se basa en 
un cálculo bastante sencillo que no requiere que la serie de valores 
esté ordenada.


Espero que todo esto te aclare las dudas y te oriente un poco mejor.

Steven





Más información sobre la lista de distribución Cconclase