Ciao e bentornato.
In questa conferenza, fornirò una dimostrazione per la nostra sfida precedente, che
consiste nella stampa del contenuto di un file in ordine inverso.
Quindi dovrai capire il metodo ftel e il metodo fseek.
Visualizziamo blocchi di codice e creiamo un nuovo progetto.
E questo progetto diventerà un'applicazione console.
Lo chiameremo semplicemente
stampa il contenuto del file
al contrario.
E creeremo prima il nostro file che contiene alcuni dati vuoti
perché dobbiamo leggere da esso. Quindi tornerò alla mia directory dei download, che è dove
si trovano i miei progetti di blocchi di codice.
E vado al progetto che
ho appena
creato, che si chiama contenuto del file di stampa.
Quindi è proprio qui. Creerò solo un nuovo file, file di testo.
Diremo nuovo documento di testo. Lo chiameremo test. testo.
E poi qui dentro, farò le
normali cose ciao
mi chiamo Jason, come stai, sto bene.
E cosa farà, lo salverò e poi inizieremo a stampare la fine.
Quindi dovrebbe stampare enif space gniod e così via fino a quando non arriva all'inizio.
Quindi torneremo ai blocchi di codice e avremo
bisogno di includere il nostro IO standard
perché contiene tutte le nostre funzioni. Creeremo una costante,
in questo caso definiremo.
E questo si chiamerà nome file, si chiamerà test. testo.
E avrò bisogno di creare prima il mio puntatore di file, quindi tutto
maiuscolo FILE star fp, e lo imposterò uguale a null, inizializzalo.
E poi creerò anche un paio di contatori
e qualcosa per rappresentare ciò da cui viene restituito: porterò il contatore
per il mio ciclo e
quindi il conteggio dei byte effettivi restituiti da ftell.
Quindi dirò che il conteggio è uguale a zero e quindi una
variabile di controllo del ciclo in I è uguale a zero.
Farò del mio normale. Ho bisogno di aprire il mio file. Dirò che fp è uguale
a fopen e passerò il nome del file. Passerò in sola lettura quindi solo r.
Mi assicurerò che non sia nullo. Quindi dirò che se fp è uguale a
null, restituirò solo un 1 negativo.
Altrimenti cercherò fino alla fine del file.
Quindi voglio fare un fseek.
Qui chiamerò la funzione fseek.
Questo cambierà la posizione di dove sto indicando. Passo il mio puntatore al file.
Passerò zero per il nostro secondo parametro.
Per il terzo parametro, dirò cerca fino alla fine.
Quindi userò quel fine di ricerca costante.
E questo imposterà il puntatore del mio file alla fine di fp,
che è test. testo.
Una volta arrivato alla fine, voglio impostare il mio contatore effettivo su
ciò a cui punta è ftell. Quindi voglio tornare dove sono.
Quindi qui ho intenzione di ottenere la posizione del puntatore del file.
E fseek ha effettivamente cambiato la
posizione, quindi sposta il puntatore del file alla fine del file.
Quindi lo sposto prima e poi ottengo la posizione. Posso ottenere la posizione usando ftell.
Per ftell, restituisce la posizione, quindi verrà memorizzata in count e dirò
che f count è uguale a f tell e poi la passo nel puntatore del file.
Una volta che ho la posizione, posso scrivere un ciclo while
che dice vai dalla posizione o dal contatore che è la mia variabile di controllo del ciclo fino alla fine.
Quindi qui posso dire mentre sono meno che contare
perché voglio praticamente leggere tutto dalla fine all'inizio.
E quindi qui dentro, voglio dire incrementare la mia variabile I.
E poi voglio cercare, voglio cambiare dove mi sto trasferendo. Quindi voglio dire fseek e
voglio indicare fp.
Voglio indicare un io negativo perché
vado dal retro all'inizio e voglio dire cerca la fine.
Così negativo sarò così tanti byte dalla fine.
Quindi prima sono riuscito a muovermi fino alla fine e
poi voglio cambiare la mia posizione in modo da poter iniziare a leggere in ogni personaggio.
Una volta che ho effettivamente cercato fino alla fine, posso
semplicemente stampare il personaggio,
leggerlo e stamparlo. Quindi qui posso solo dire
percent c, quindi posso dire fgetc e il
puntatore del mio file.
Quindi di nuovo, quello che sto facendo qui è sulla riga 22 o 19,
prima, sposto il puntatore alla fine.
Quindi ottengo il mio contatore perché questo mi dirà quanto tempo devo leggere in ogni
byte usando ftell.
Quindi il mio ciclo while andrà da zero fino
a contare, quanti byte voglio leggere.
Alla riga 26, incrementerò il contatore.
Quindi cercherò i tanti byte dalla fine, che
è meno I dalla fine. E poi le righe 28, leggerò quel carattere e lo stamperò.
E questa è la logica principale del programma.
L'unica altra cosa che devo fare è stampare un avanzamento riga alla fine, solo
per renderlo più facile da leggere. Voglio chiudere il puntatore del file.
Quindi voglio dire fp, e poi voglio solo tornare,
e probabilmente voglio impostare fp uguale a null.
Quindi proviamo a compilarlo, e quello che vedremo, si spera,
è la stampa del file in ordine inverso.
Non stiamo cambiando il contenuto del
file, lo stiamo solo leggendo dalla fine all'inizio usando le nostre funzioni di posizione.
Quindi, quando eseguiamo questo, dovremmo vedere
l'ordine opposto o inverso. E quindi quello che noterai qui è che vediamo l'ordine inverso.
Quindi stampiamo prima l'ultimo file.
E se richiamiamo quel file nella nostra directory dei
download, noterai
che viene stampato come output.
Sta stampando enif
space gniod e così via.
L'ultima riga che viene stampata è ciao, mi chiamo Jason al contrario.
Quindi è solo un piccolo programma pulito
che utilizzerà i puntatori dei file per iniziare alla
fine e poi andare all'inizio e stampare i contenuti in ordine inverso.
Quindi nota come usiamo fseek, nota come usiamo ftell.
Fseek sposta il puntatore del file, ftell ottiene effettivamente dove
ti trovi nella posizione del file.
Quindi ora puoi usare il conteggio per andare al contrario.
E poi di nuovo, usa I negativo per dire quanti byte dalla fine e
fgetc con un puntatore a file.
Fornirò questo codice sorgente come soluzione e potrai confrontarlo, esaminarlo e
analizzarlo in modo più dettagliato. Spero che questo abbia aiutato. Grazie.