Ayuda con un problema en C (Ficheros)

B

Tengo este módulo que lo que hace es copiarme los datos de un archivo en un vector y luego mostrarmelos por pantalla.

Código

Pues bien, tengo que hacer ahora un módulo que haga exactamente lo mismo solo que me copie los datos a la inversa, es decir, los últimos datos los primeros, los anteriores los segundos y así ... y francamente no se como enfocarlo.

¿Me podéis echar una mano? Gracias

oFF-sIDE

Te refieres a copiar un vector en otro pero en sentido inverso?

Has pensado en crear otro vector v2 y recorrerlo asignando el valor de (v1.lenght)-i al valor v2 ? Me explico como el ojete xD

B

Me refiero a copiar los datos del archivo a un vector pero en sentido inverso, el último elemento en primera posición, el penúltimo en la segunda posición, etc....

oFF-sIDE

Pues añade a lo que ya tenías lo que te he dicho en #2 :/

B

Vale, no había caído en eso, yo suponía que habría que hacerlo con las funciones específicas (fseek, fread, etc...) pero weno que así también puede valer jajaja

Muchas gracias máquina.

oFF-sIDE

Seguramente se pueda hacer de un modo mucho más eficiente como recorriendo sólo medio vector y almacenando en variables el contenido del vector en "i" y en "v1.length-i" e intercambiándolas, pero habría que entrar en casos dependiendo si el tamaño es par o impar y demás movidas.

Si ya tienes hecho lo que ya comentabas esta es la forma más rápida de hacerlo, aunque no creo que sea la más eficiente :/

LOc0

La forma más eficiente es invertirlo una vez lo tienes cargado en memoria (si el fichero no es muuuuuuuuuuuuuuuuuuuuuuuuy grande claro).

Para invertir un array de lo que sea necesitas una variable auxiliar y vas intercambiando las posiciones y la [LONGITUD-1-i] (Empezando con i=0) Eso lo haces mientras sea estrictamente menor que [LONGITUD-1-i]

Salu2 ;)

PD: Tb puedes leerlo hacia atrás usando fseek() y un contador que vaya bajando, o mediante una función recursiva, etc...

erdanblo

Yo haria lo que dice #7, leerlo desde el final.

Fr4nk0

Lo mejor es hacer lo que te han dicho anteriormente.
Con la función fseek colocar el puntero al final del fichero, e ir recorriendolo hacia atrás mientras en el array lo guardas desde el principio. Es lo más eficiente.

Si no te importa la eficiencia, pues lo que te han dicho antes también, guardalo en el orden en que lo lees, y luego le das la vuelta con otra función y listo.

Soleil

Yo lo haría de otro modo...
Leería el fichero normalmente, pero escribiría en el vector desde el final hacia el principio. (evitando uso de fseek)

JuAn4k4

Leer desde el principio del fichero y escribiendo a partir de la posicion final, ya que ademas conoces el tamaño de cada elemento que lees.

Al final (si es una funcion) devuelve el puntero a la primera posicion ( no del vector ) sino donde te quedaras al leer el fichero.

Usuarios habituales