Merhaba, tekrar hoş geldiniz.
Bu derste, bir dosyanın içeriğini ters sırada yazdırmak
olan bir önceki görevimiz için bir gösteri sunacağım.
Bu yüzden ftel yöntemini ve fseek yöntemini anlamanız gerekecek.
Kod bloklarını getirelim ve yeni bir proje oluşturalım.
Ve bu proje bir konsol uygulaması olacak.
Buna dosya içeriğini
tersten yazdır adını vereceğiz.
İlk olarak içinde boş veri bulunan bir dosya oluşturacağız çünkü bu
dosyadan okuma yapmamız gerekiyor. Bu yüzden kod blokları projelerimin bulunduğu
indirilenler dizinime geri döneceğim.
Ve az önce oluşturduğum
dosya içeriğini
yazdır adlı projeye gideceğim.
İşte burada. Yeni bir dosya oluşturacağım, metin dosyası.
Yeni metin belgesi diyeceğiz. Adını test koyalım. Metin.
Ve sonra içeride, normal merhaba benim
adım Jason, nasılsın,
iyiyim gibi şeyler yapacağım.
Ve bu ne yapacak, onu kaydedeceğim ve sonra sonunu yazdırmaya başlayacağız.
Bu nedenle, enif boşluk gniod ve başlangıca ulaşana kadar bu şekilde yazdırmalıdır.
Bu yüzden kod bloklarına geri döneceğiz ve tüm
fonksiyonlarımızı içerdiği için standart
IO'muzu dahil etmemiz gerekecek. Bir sabit oluşturacağız,
bu durumda tanımlayacağız.
Bunun adı dosya adı olacak ve test olarak adlandırılacak. Metin.
Önce dosya işaretçimi oluşturmam gerekecek, yani büyük harflerle FILE
star fp, ve bunu null'a eşit olarak ayarlayıp başlatacağım.
Ayrıca birkaç sayaç ve ftell'den döndürülenleri
temsil edecek bir şey oluşturacağım - döngüm için sayacı ve ardından
ftell'den döndürülen gerçek baytların
sayısını taşıyacağım.
Bu yüzden sayım sıfıra eşittir diyeceğim ve ardından bir döngü
kontrol değişkenini I eşittir sıfıra dönüştüreceğim.
Her zamanki işimi yapacağım. Dosyamı açmam gerek. fp eşittir fopen diyeceğim
ve dosya adını gireceğim. Sadece okunmuş olarak geçeceğim, yani sadece r.
Bunun boş olmadığından emin olacağım. Yani fp null'a eşitse, negatif 1 döndüreceğimi
söyleyeceğim.
Aksi takdirde, dosyanın sonuna kadar arayacağım.
Bu yüzden bir fseek yapmak istiyorum.
Burada fseek fonksiyonunu çağıracağım.
Bu, işaret ettiğim yerin konumunu değiştirecek. Dosya işaretçimi ileteceğim.
İkinci parametremiz için sıfır değerini gireceğim.
Üçüncü parametre için sonuna kadar ara diyeceğim.
Bu yüzden bu sabit arama ucunu kullanacağım.
Bu da dosya işaretçimi fp'nin sonuna, yani test'e ayarlayacak.
Metin.
Sona geldiğimde, gerçek sayacımı ftell olarak işaret ettiği
şeye ayarlamak istiyorum. Bu yüzden olduğum yere geri dönmek istiyorum.
Burada dosya işaretçisinin konumunu alacağım.
Ve fseek aslında konumu değiştirdi, bu
yüzden dosya işaretçisini dosyanın sonuna taşıdı.
Bu yüzden önce onu hareket ettiriyorum ve sonra pozisyonu alıyorum. ftell kullanarak pozisyonu alabiliyorum.
ftell için, pozisyonu döndürür, bu yüzden bu count içinde saklanacak
ve f count eşittir f tell diyeceğim ve sonra dosya işaretçisine aktaracağım.
Pozisyonu aldıktan sonra, pozisyondan veya döngü kontrol
değişkenim olan sayaçtan sonuna kadar git diyen bir while döngüsü yazabilirim.
Bu yüzden burada saymaktan daha az olduğunu söyleyebilirim çünkü
temelde her şeyi sondan başa doğru okumak istiyorum.
Bu yüzden içeride, ben değişkenimi arttırmak istiyorum.
Sonra da arayışa girmek, taşındığım yeri değiştirmek istiyorum. Bu yüzden fseek demek istiyorum ve
fp'yi işaret etmek istiyorum.
Olumsuz bir ben'e işaret etmek istiyorum çünkü
arkadan başa doğru gidiyorum ve sonu ara demek istiyorum.
O kadar olumsuz ki, sondan itibaren çok fazla bayt olacak.
Bu yüzden önce sonuna kadar gidebildim ve sonra konumumu
değiştirmek istiyorum, böylece her karakterde okumaya başlayabilirim.
Gerçekten sonuna kadar aradıktan sonra, karakteri
okuyup çıktısını alabilirim.
Yani
burada sadece yüzde c diyebilirim ve sonra fgetc ve dosya işaretçimi
söyleyebilirim.
Burada yine 22. satırda ya da 19. satırda yaptığım şey, önce
işaretçimi sona taşımak.
Sonra sayacımı alıyorum çünkü bu bana ftell kullanarak her baytı ne kadar süre okumam gerektiğini
söyleyecek.
Sonra while döngüm sıfırdan başlayıp kaç bayt okumak
istediğimi sayana kadar devam edecek.
26. satırda sayacı artıracağım.
Daha sonra, sondan itibaren eksi I olan sondan itibaren
şu kadar bayt'ı arayacağım. Ve sonra 28. satır, bu karakteri okuyacağım ve çıktısını alacağım.
Programın ana mantığı da bu.
Yapmam gereken diğer tek şey, sadece okumayı kolaylaştırmak için sonunda bir
satır beslemesi yazdırmak istiyorum. Dosya işaretçimi kapatmak istiyorum.
Yani fp demek istiyorum ve sonra sadece geri dönmek istiyorum
ve muhtemelen fp'yi null'a eşitlemek istiyorum.
Şimdi bunu derlemeyi deneyelim ve umarım göreceğimiz
şey dosyanın ters sırada yazdırılması olacaktır.
Dosyanın içeriğini değiştirmiyoruz,
sadece konum fonksiyonlarımızı kullanarak dosyayı sondan başa doğru okuyoruz.
Yani bunu çalıştırdığımızda tam tersini veya
ters sırayı görmeliyiz. Ve burada fark edeceğiniz şey, ters sıralamayı görmemizdir.
Bu yüzden önce son dosyanın çıktısını alıyoruz.
Ve bu dosyayı indirilenler dizinimize getirirsek,
çıktı olarak yazdırıldığını
fark edeceksiniz.
Enif boşluk gniod ve
benzerlerini yazdırıyor.
Yazdırılan son satır, tersten merhaba benim adım Jason.
Yani dosya işaretçilerini kullanarak
sondan başlayıp başa giden ve içeriği ters
sırada yazdıran küçük bir program.
Yani fseek'i nasıl kullandığımıza dikkat edin, ftell'i nasıl kullandığımıza dikkat edin.
Fseek dosya işaretçisini hareket ettirir, ftell aslında dosyanın
konumunda nerede olduğunuzu alır.
Yani şimdi geri gitmek için sayımı kullanabilirsiniz.
Ve sonra tekrar, sondan kaç bayt olduğunu söylemek için negatif I kullanın ve bir
dosya işaretçisi ile fgetc kullanın.
Bu kaynak kodunu bir çözüm olarak sunacağım ve siz de karşılaştırabilir, bakabilir ve daha
ayrıntılı olarak analiz edebilirsiniz. Umarım yardımcı olmuştur. Teşekkür ederim.