Hallo, en welkom terug.
In deze lezing zal ik een demonstratie geven van onze vorige uitdaging, namelijk
het afdrukken van de inhoud van een bestand in omgekeerde volgorde.
U zult dus de ftel-methode en de fseek-methode moeten begrijpen.
Laten we codeblokken naar voren brengen en een nieuw project maken.
En dit project wordt een consoletoepassing.
We gaan het
gewoon de inhoud van het afdrukbestand in
omgekeerde volgorde noemen.
En we gaan eerst ons bestand maken dat lege gegevens bevat,
omdat we ervan moeten lezen. Dus ik ga terug naar mijn downloadmap,
waar mijn codeblokprojecten zich bevinden.
En ik ga naar het project
dat ik
zojuist heb gemaakt, dat de inhoud van het afdrukbestand heet.
Dus het is hier. Ik ga gewoon een nieuw bestand maken, een tekstbestand.
We zeggen nieuw tekstdocument. We zullen het een test noemen. tekst.
En dan hier binnen, ik doe gewoon de
normale hoi mijn naam
is Jason, hoe gaat het, met mij gaat het goed.
En wat dit zal doen, ik zal het opslaan, en dan gaan we beginnen met het afdrukken van het einde.
Dus het zou enif space gniod enzovoort moeten afdrukken totdat het bij het begin komt.
Dus we gaan terug naar codeblokken, en we
zullen onze standaard IO moeten opnemen omdat
die al onze functies bevat. We gaan een
constante maken, in dit geval definiëren.
En dit gaat de bestandsnaam heten, het gaat test heten. tekst.
En ik moet eerst mijn bestandsaanwijzer maken, dus alle caps FILE star
fp, en ik ga dat gelijk stellen aan null, initialiseren.
En dan ga ik ook een paar tellers maken en
iets om weer te geven van wat wordt geretourneerd - ik ga de teller
voor mijn lus dragen en dan
de telling van de daadwerkelijke bytes die wordt geretourneerd door ftell.
Dus ik ga zeggen dat het aantal gelijk is aan nul en
dan is een regelvariabele van de lus in I gelijk aan nul.
Ik ga mijn normale doen. Ik moet mijn dossier openen. Ik ga zeggen dat fp gelijk
is aan fopen, en ik zal de bestandsnaam doorgeven. Ik ga alleen-lezen doorgeven, dus gewoon r.
Ik zal ervoor zorgen dat dit niet nul is. Dus ik ga zeggen dat als fp gelijk is aan
nul, ik gewoon een min 1 teruggeef.
Anders ga ik naar het einde van het bestand zoeken.
Dus ik wil een fseek doen.
Hier ga ik de functie fseek aanroepen.
Dit gaat de positie veranderen van waar ik naar wijs. Ik ga mijn bestandsaanwijzer doorgeven.
Ik ga nul doorgeven voor onze tweede parameter.
Voor de derde parameter ga ik zeggen tot het einde zoeken.
Dus ik ga dat constante zoekeinde gebruiken.
En dat zal mijn bestandsaanwijzer op het einde van fp zetten,
wat test is. tekst.
Als ik aan het einde ben, wil ik mijn werkelijke teller instellen
op waar het naar verwijst, ftell. Dus ik wil terug naar waar ik ben.
Dus hier ga ik de positie van de bestandsaanwijzer krijgen.
En de fseek veranderde eigenlijk de positie,
dus het verplaatst de bestandsaanwijzer naar het einde van het bestand.
Dus ik verplaats het eerst en dan krijg ik de positie. Ik kan de positie krijgen met ftell.
Voor ftell retourneert het de positie, dus dat wordt opgeslagen in count en ik
ga zeggen f count is gelijk aan f tell en geef het dan door in de bestandsaanwijzer.
Zodra ik de positie heb, kan ik een while-lus schrijven die zegt
dat ik van de positie of de teller ga, wat mijn regelvariabele voor de lus is, helemaal tot het einde.
Dus hier kan ik zeggen dat ik minder ben dan tellen omdat ik
in principe alles van het einde tot het begin wil lezen.
En dus hierbinnen, wil ik zeggen: verhoog mijn I-variabele.
En dan wil ik zoeken, ik wil veranderen waar ik naartoe ga. Dus ik wil fseek zeggen, en
ik wil naar fp wijzen.
Ik wil wijzen op een negatief ik omdat ik
van terug naar het begin ga, en ik wil zeggen zoek het einde.
Zo negatief dat ik vanaf het einde zoveel bytes zal zijn.
Dus eerst kon ik naar het einde gaan en
daarna wil ik mijn positie veranderen zodat ik in elk personage kan beginnen te lezen.
Als ik eenmaal tot het einde heb gezocht, kan ik het
personage gewoon uitprinten, het personage
lezen en uitprinten. Dus hier kan ik gewoon
procent c zeggen, en dan kan ik fgetc
en mijn bestandsaanwijzer zeggen.
Dus nogmaals, wat ik hier doe is op regel 22 of regel 19, eerst verplaats
ik mijn aanwijzer naar het einde.
Dan krijg ik mijn teller omdat die me zal vertellen hoe lang ik elke byte moet inlezen
met behulp van ftell.
Dan gaat mijn while-lus van nul tot het
tellen, hoeveel bytes ik wil inlezen.
Op regel 26, ga ik de teller verhogen.
Ik ga dan zoeken naar de zoveel bytes vanaf het einde,
dat is min I vanaf het einde. En dan regel 28, ik ga dat karakter inlezen en uitprinten.
En dat is de belangrijkste logica van het programma.
Het enige wat ik verder nog hoef te doen, is dat ik aan het eind een line
feed wil uitprinten, om het leesbaarder te maken. Ik wil mijn bestandsaanwijzer sluiten.
Dus ik wil fp zeggen, en dan wil ik gewoon terugkeren,
en ik wil waarschijnlijk fp gelijk stellen aan nul.
Dus laten we proberen dit te compileren, en hopelijk zullen we
zien dat het bestand in omgekeerde volgorde wordt afgedrukt.
We veranderen de inhoud van het bestand
niet, we lezen het gewoon van het einde tot het begin in met behulp van onze positiefuncties.
Dus als we dit uitvoeren, zouden we de tegenovergestelde
of omgekeerde volgorde moeten zien. En wat je hier zult opmerken, is dat we de omgekeerde volgorde zien.
We printen dus eerst het laatste bestand uit.
En als we dat bestand in onze downloadmap plaatsen, zult
u merken
dat het als uitvoer wordt afgedrukt.
Het print
enif space gniod enzovoort.
De laatste regel die is uitgeprint is hallo mijn naam is Jason in omgekeerde volgorde.
Het is dus gewoon een leuk klein programma dat
de bestandsaanwijzers gebruikt om aan het einde te beginnen en dan
naar het begin te gaan en de inhoud in omgekeerde volgorde af te drukken.
Dus merk op hoe we fseek gebruiken, merk op hoe we ftell gebruiken.
Fseek verplaatst de bestandsaanwijzer, ftell krijgt daadwerkelijk waar u zich bevindt
op de locatie van het bestand.
Dus nu kun je de telling gebruiken om achteruit te gaan.
En nogmaals, gebruik negatief I om te zeggen hoeveel bytes vanaf het einde
en fgetc met een bestandsaanwijzer.
Ik geef deze broncode als oplossing, en je kunt het vergelijken en bekijken
en analyseren in meer detail. Hoop dat dit heeft geholpen. Dank u.