Hola y bienvenido de nuevo.
En esta conferencia, proporcionaré una demostración de nuestro desafío anterior, que
es imprimir el contenido de un archivo en orden inverso.
Por lo tanto, necesitará comprender el método ftel y el método fseek.
Hagamos aparecer bloques de código y creemos un nuevo proyecto.
Y este proyecto será una aplicación de consola.
Vamos a nombrarlo
simplemente el contenido del archivo de
impresión al revés.
Y primero crearemos nuestro archivo que tiene algunos datos vacíos
porque necesitamos leer de él. Así que voy a volver a mi directorio de descargas, que
es donde están mis proyectos de bloques de código.
Y voy a ir al proyecto
que acabo
de crear, que se llama contenido del archivo de impresión.
Así que está aquí. Solo voy a crear un nuevo archivo, archivo de texto.
Diremos nuevo documento de texto. Lo llamaremos prueba. texto.
Y luego, dentro de aquí, haré
lo normal. Hola,
mi nombre es Jason, ¿cómo estás? Estoy bien.
Y lo que hará esto, lo guardaré, y luego comenzaremos a imprimir el final.
Por lo tanto, debe imprimir enif space gniod y así sucesivamente hasta que llegue al principio.
Así que volveremos a los bloques de
código y necesitaremos incluir nuestro IO estándar
porque contiene todas nuestras funciones. Vamos a crear
una constante, en este caso definir.
Y esto se llamará nombre de archivo, se llamará prueba. texto.
Y primero necesitaré crear mi puntero de archivo, así que todo en mayúsculas FILE
star fp, y lo voy a establecer igual a nulo, inicializarlo.
Y luego también voy a crear un par de
contadores y algo para representar lo que se devuelve; llevaré el contador para
mi bucle y luego el
recuento de los bytes reales que se devuelven desde ftell.
Así que voy a decir que el recuento es igual a cero y
luego una variable de control de bucle en I es igual a cero.
Voy a hacer mi normalidad. Necesito abrir mi archivo. Voy a decir que fp es
igual a fopen y pasaré el nombre del archivo. Voy a pasar solo lectura, así que solo r.
Me aseguraré de que esto no sea nulo. Entonces, voy a decir que si fp es igual
a nulo, solo devolveré un 1 negativo.
De lo contrario, buscaré hasta el final del archivo.
Así que quiero hacer una búsqueda.
Aquí voy a llamar a la función fseek.
Esto va a cambiar la posición a la que estoy apuntando. Voy a pasar el puntero de mi archivo.
Voy a pasar cero para nuestro segundo parámetro.
Para el tercer parámetro, voy a decir buscar hasta el final.
Así que voy a utilizar ese fin de búsqueda constante.
Y eso va a establecer mi puntero de archivo al final de fp,
que es test. texto.
Una vez que llegue al final, quiero configurar mi contador real a
lo que apunta es ftell. Por eso quiero volver a donde estoy.
Así que aquí voy a obtener la posición del puntero del archivo.
Y el fseek realmente cambió la posición,
por lo que mueve el puntero del archivo al final del archivo.
Entonces lo muevo primero y luego obtengo la posición. Puedo obtener la posición usando ftell.
Para ftell, devuelve la posición, por lo que se almacenará en count y voy
a decir que f count es igual a f tell y luego lo pasaré en el puntero del archivo.
Una vez que tengo la posición, puedo escribir un ciclo while
que diga ir desde la posición o el contador, que es mi variable de control de ciclo, hasta el final.
Así que aquí puedo decir mientras yo es menos que contar porque
básicamente quiero leer todo desde el final hasta el principio.
Y aquí dentro, quiero decir incrementar mi variable I.
Y luego quiero buscar, quiero cambiar el lugar al que me muevo. Así que quiero decir fseek
y quiero señalar fp.
Quiero señalar un yo negativo porque voy
de atrás hacia el principio, y quiero decir busca el final.
Tan negativo que voy a estar a tantos bytes del final.
Entonces, primero pude moverme hasta el final y
luego quiero cambiar mi posición para poder comenzar a leer en cada carácter.
Una vez que he buscado el final, puedo
imprimir el personaje, leerlo
e imprimirlo. Así que aquí solo puedo
decir porcentaje c, y luego puedo decir fgetc y
mi puntero de archivo.
De nuevo, lo que estoy haciendo aquí es en la línea 22 o en la línea 19,
primero, muevo el puntero hasta el final.
Luego obtengo mi contador porque eso me dirá cuánto tiempo tengo para leer en cada
byte usando ftell.
Luego, mi ciclo while irá desde cero hasta el
final para contar cuántos bytes quiero leer.
En la línea 26, voy a incrementar el contador.
Luego voy a buscar tantos bytes desde el final, que
es menos I desde el final. Y luego las líneas 28, leeré ese carácter y lo imprimiré.
Y esa es la lógica principal del programa.
Las únicas otras cosas que tengo que hacer es imprimir un salto de línea al final,
solo para que sea más fácil de leer. Quiero cerrar el puntero de mi archivo.
Entonces quiero decir fp, y luego solo quiero regresar,
y probablemente quiero establecer fp igual a nulo.
Así que intentemos compilar esto, y lo que veremos con
suerte es la impresión del archivo en orden inverso.
No estamos cambiando el contenido del archivo,
solo lo estamos leyendo desde el final hasta el principio usando nuestras funciones de posición.
Entonces, cuando ejecutamos esto, deberíamos ver el
orden opuesto o inverso. Entonces, lo que notará aquí es que vemos el orden inverso.
Primero imprimimos el último archivo.
Y si mostramos ese archivo en nuestro directorio de
descargas, notará
que se está imprimiendo como salida.
Está imprimiendo enif
space gniod y así sucesivamente.
La última línea impresa es hola, mi nombre es Jason al revés.
Así que es solo un pequeño programa ordenado
que usará los punteros de archivo para comenzar por el
final y luego ir al principio e imprimir el contenido en orden inverso.
Así que observe cómo usamos fseek, observe cómo usamos ftell.
Fseek mueve el puntero del archivo, ftell realmente llega a donde
estás en la ubicación del archivo.
Entonces ahora puede usar el conteo para ir al revés.
Y, de nuevo, use I negativo para decir cuántos bytes del final y
fgetc con un puntero de archivo.
Proporcionaré este código fuente como una solución, y puede compararlo, mirarlo
y analizarlo con más detalle. Espero que esto haya ayudado. Gracias.