Merhaba, tekrar hoş geldiniz.
Bu konuşmada, şu konulardan bahsetmek istiyorum dosya konumlandırma hakkında, temelde
size izin verecek bazı işlevler bir dosyanın konumunu değiştirmek için.
Yani birçok uygulama için bir dosyadaki verilere sıralı düzen dışında
erişebilmeniz gerekir.
Sıralı düzen başlıyor başlangıçta ve sonra
sona doğru bayt bayt ilerliyor.
Bu her zaman yararlı değildir çünkü bir dosyanın ortasına gidip
verileri almak isteyebilirsiniz veya dosyanın sonuna gidin ve verileri alın.
Her şey uygulamaya bağlıdır.
Her zaman gitmek istemezsin başından sonuna kadar.
Yani çeşitli işlevler var verilere rastgele sırayla erişmek için
kullanabileceğiniz bir araçtır.
İki husus söz konusudur dosya konumlandırma.
Birincisi, nerede olduğunuzu bulmak bir dosyadadır ve diğeri dosyada belirli
bir noktaya hareket etmektedir.
Bunlar gerçekten iki şey dosyalar ve bir dosyanın konumlandırılması
hakkında konuşurken öğrenmek istediğiniz dosyasının gerçekte neye işaret ettiği.
Yine, dosyanın neresinde olduğunuz ve dosyada başka bir yere taşımak isteyip
istemediğinizi belirtir.
Böylece dosyaya şu adresten erişebilirsiniz dosyayı açıp açmadığınızdan bağımsız olarak
rastgele bir konum, dosya ortağınızı taşıyabilirsiniz.
Açmanıza gerek yok nerede olduğunuzu görmek için nerede olduğunuzu
değiştirmek için dosya.
Yani nerede olduğunuzu bulmak ilk olarak konuşacağız.
Bulmanız gereken iki fonksiyon var bir dosyada nerede olduğunuzu.
ftel olarak adlandırılır ve biri fgetpos, fget position olarak adlandırılır.
ftell için, asıl işlev tanımı oldukça basittir.
Geri dönüyorsun ve bir dosya işaretçisi alırsınız.
Ve bu fonksiyon şunları kabul edecek argüman olarak bir dosya
işaretçisi ve uzun tamsayı döndürecektir değeri dosyadaki karakter konumunu
belirtir, bu nedenle size pozisyonu söyleyeceğim.
Oluşturarak kullanabilirsiniz değişkeni, bu durumda fpos, ne alacak döndürür
ve sonra bu dosya işaretçisini geçirir
ve ftel'i çağırır.
f konum değişkeni şimdi şunları tutar dosyadaki geçerli konumu belirler ve dosyaya
geri dönmek için kullanabilirsiniz. sonraki herhangi bir zamanda pozisyon.
Bu yüzden size fpozisyonunu döndürecektir.
İşte bu şekilde İşaret ettiğiniz mevcut
noktanın konumu.
Değer, bayt cinsinden ofsettir dosyanın başından itibaren.
Yani çok basit bir şekilde işaretçinizi ilettiğinizde size geri
dönecek ve nerede olduğunuzu söyleyecektir. dosyanızda temel olarak dosyanın
başlangıcından başlangıçtan itibaren kaç bayt.
Yani bu örnekte, şunları oluşturuyoruz fp adında bir dosya işaretçisi ve length adında
bir tamsayı oluşturuyoruz.
Dosyayı açacağız, ve bu sadece okumak için olacaktır.
Yapacağız boş olmadığından emin ol.
Eğer öyleyse. bir hata döndürmek için.
Ve sonra fseek için endişelenmeyin.
Fseek aslında sadece dosyanın sonuna gitmek için.
Bu da bize yardımcı olan bir başka işlevdir.
Ben sadece ftel'i gösterin.
Fseek sonuna kadar gidecek ve sonra ftell
fp diyeceksiniz ve bu da size dosyanın sonunda olacağınızı söylemek
için.
Yani döndürülen bağlantı dosyanın sonundadır.
Ve böylece ne olacak uzunluğa bağlı olarak dosyanın
toplam boyutunu döndürecektir çünkü aslında işaretçinizi sona getirdiniz
ve sonra Neredeyim dediğimde sonda olduğunu söyledi, o yüzden
sonu geri getir.
Ve son olarak da son okuduğunuz zamandan itibaren baytlar.
Şimdi şuna içeriden bir göz atalım güzel IDE kod bloklarımızın.
İşte kodlama örneğimiz dosya işaretçimizi oluşturduğumuz yer.
Null olarak ayarlayıp boş olmadığından emin ol.
Açmaya çalışıyoruz.
Ve sonra bir fseek yaparız ki bu sadece dosya işaretçimizi değiştireceğiz.
Ftel bize söyleyecek nereye işaret ettiğimizi.
Bu yüzden de ve sonuna kadar herhangi bir
sayıda bayt olacak.
Bunu çalıştırdığımızda, ne yapacaksın? dikkat edilmesi gereken nokta 24 bayt göstermesidir.
Bu da demek oluyor ki dosyasının küçük bir dosya olması ve dosyanın yalnızca
24 bayt içermesi nedeniyle.
Tipik olarak, ftel'i biraz yazı yazdıktan veya okuduktan
sonra ya da fseek nereye taşındığınızı.
Ama ftel'i aramak çok basit dosya işaretçisi ile ve sonra len
sadece nerede olduğunuzu söyler.
Ayrıca fget position veya fgetpos işlevi.
Ve bu da ikinci bir işlevdir geçerli dosya konumu hakkında
bilgi sağlar.
Bu biraz daha ftel'den daha karmaşık.
Bu bir tamsayı döndürür.
Bir dosya işaretçisi alır ve ayrıca f konum t türünü de alır.
Yani ilk parametre Bu dosya işaretçisi sayesinde hangi dosyayı
okumanız gerektiğini bilirsiniz.
İkinci parametre bir işaretçidir. standardio'da tanımlanan tip. h.
f pozisyonu t tipi şunları yapabilir bir dosya içindeki her konumu kaydeder.
Yani fget pozisyon fonksiyonu konumlandırma işlevi fset
konumu olduğunda kullanılmak üzere tasarlanmıştır.
Yani fset position ve daha sonra bununla birlikte fget pozisyonunu
kullanırsınız.
Yani fget pozisyon fonksiyonu dosya için geçerli konum ve dosya
durumu bilgilerini saklar ve konumunu belirler ve işlem başarılı
olursa sıfır döndürür, bir başarısızlık için sıfır olmayan tamsayı değeri.
Böylece bir s konum türünde değişken.
Ve burada sadece burada olduğunu söylüyoruz.
Sonra fget pozisyonunu çağırırız.
Dosya işaretçimizde belirtiyoruz ve f pozisyon tipimizde belirtiyoruz.
İşareti geçmeliyiz. çünkü bu bir işaretçi değildir.
Yani bu durumda, mevcut dosya konumu hello değişkeninde
veya buradadır.
Bu yüzden bir değişken bildirmeniz gerekir f konum t tipinde
çünkü bu sizin parametresi, ikinci parametreniz.
'nin bir işaretçisini bildirebilirsiniz. f position t star yazın çünkü herhangi bir
anı olmayacaktır konum verilerini saklamak için ilişkilendirilmiştir.
Öyleyse bir örneğe bakalım bu çok daha mantıklı olacak.
Bu durumda, dosyamızı oluşturuyoruz işaretçisi, f possession t tipi pozisyonumuzu
oluşturuyoruz, open ve sonra fget pozisyonunu çağırıyoruz.
Ve dosyamıza geçiyoruz son konumumuzdaki işaretçi.
İşte burada pozisyonu saklamak.
Biz alacağız bulunduğumuz konum.
O zaman f'nin s'yi koyduğunu söylediğimizde, Nereye gidersek gidelim bazı
verileri oraya yazıyoruz.
Yani yine, f pozisyon alır ve ftell size aslında nereye yazmak veya nereden okumak istediğinizi
söyler.
Ortalarda bir yerde.
Başlangıçta değil, Sonunda değil.
Taşınıyorsun.
Genellikle bir arayışla hareket edersiniz veya başka bir şeyle hareket etmeniz,
pozisyon almanız ve bu nerede olduğunuzu söyler.
Yani fget pozisyonu ve ftell size tam olarak nereye işaret ettiğinizi söyleyecek
ve bu başka bir yere taşınabileceğiniz ve okuyabileceğiniz anlamına
gelir.
Şimdi bir pozisyon ayarlamak Bu noktaya kadar olan dosyayı sadece bulunduğumuz
yerden okuyoruz.
Gerçekten okumayacağız Bir şey ayarlamadığımız sürece
bulunduğumuz yerde bir okuma ve yazma yaptık.
Yani bir tamamlayıcı olarak ftell, ayrıca fseek de var.
Ve fseek şunları yapmanıza izin verecek pozisyonun için bir yere taşın.
Bir int döndürür.
Bir dosya işaretçisi, uzun bir fset ve bir tamsayı orijinal.
İlk parametre bir işaretçidir yeniden konumlandırdığınız dosyaya.
İkinci ve üçüncü parametreler şunları tanımlar dosyada nereye gitmek istediğinizi belirleyin.
İkinci parametre bir Üçüncü parametre tarafından belirtilen
bir referans noktasının bulunduğu ofset.
Referans noktası bir tane olabilir önceden tanımlanmış isimlerle
belirttiğiniz üç değerden oluşur.
Arama seti, arama akımı ve arama sonu.
Arayış seti şunları tanımlar dosyanın başlangıcı.
Seek cur geçerli olanı tanımlar dosyadaki konumu ve seek end
dosyanın sonunu tanımlar.
Yani bir metin modu dosyası için, ikinci bağımsız değişken ftel tarafından döndürülen
bir değer olmalıdır.
Yani fseek ile şunu fark etmelisiniz ve ftel, birlikte kullanılırlar.
Yani metin için üçüncü argüman modu dosyaları arama ayarlı olmalıdır.
Metin dosyaları için tüm işlemler fseek ile yapılan işlemler, fseek'in başlangıcı referans
alınarak gerçekleştirilir. hakkında çok fazla şey öğrenmediğimiz ikili
dosyalar için dosya.
Ancak ikili dosyalar için offset argümanı basitçe göreli
bir bayt sayısıdır.
Bu nedenle, şunları sağlayabilirsiniz referans olduğunda ofset için
pozitif veya negatif değerler noktası seek cur olarak belirtilir.
Şimdi bir örneğe bakalım.
İşte bu örnekte, tekrar, fputs yapıyoruz.
Bu yüzden bazı verileri dosyasını ve ardından fseek'i kullanırız.
Fseek sizi harekete geçirecek.
İşte bu diyor ki yedi bayt taşıyacağız ve seek set'i kullanarak istediğimizi
söyleyeceğiz başlangıçtan itibaren temel olarak yedi baytlık bir
yere taşımak için.
Ve biz de dosyanın başlangıcını yedi
bayt kaydıracak.
Yedi bayttan sonra, şunları yapabiliriz aslında ona veri yazmak.
Ve aynı zamanda yedi bayt sonra nerede olduğumuzu görmek için
ftell kullanın.
Bilgileri şu amaçlarla kullanabilirsiniz Olduğun yerden geri dön.
Yine, fseek'in tüm amacı ve fgets ya belirtmek için nerede bulunduğunuzu
görüyorsunuz yazmak veya okumak istediğiniz yer.
Yani fseek s aslında konumu hareket ettirin, tell size nerede bulunduğunuzu
söyleyecektir.
Fset pozisyonu da fseek gibidir.
Ancak fset konumu bir biraz daha karmaşık.
Fset pozisyonu ile gidecektir.
Yani fset get get pozisyonu da fset pozisyonuna çok benzer.
fset konumu ile ilk parametreyi açık dosyaya bir işaretçi
olarak belirtir.
İkinci parametre bir f konum t türünde işaretçi.
Depolanan pozisyon adresinde fget konumunu
içererek elde edilmiştir.
Yani fset pozisyonunda dosyanız var işaretçisi ve ardından gerçek değişkeniniz.
Ve buradaki değişken daha önce fget position çağrısı tarafından ayarlanır.
Yine, kullanacaksın fset ve fget birlikte.
fset konumu bir hata durumunda sıfır olmayan değer veya başarılı olduğunda
sıfır değer.
Bu işlev şu şekilde tasarlanmıştır fget position tarafından
döndürülen bir değerle çalışmak için.
Yani bunu yalnızca bir Bir dosyada daha önce bulunduğunuz bir yeri almak için
dosyadaki numara.
Fseek herhangi birine gitmenizi sağlar konumunu sadece uygun ofseti belirterek
belirleyebilirsiniz.
Yani burada şu var gibi görünüyor f pozisyonumuz t tipi pozisyon.
Dosyamızı açıyoruz ve sonra fget pozisyonunu çağırırız.
fget konumunda, şunu belirtiyoruz işaretçiyi nereye taşımak
istediğimizi, gerçekte nerede olduğumuzu dosyada okuma veya yazma.
Daha sonra fputs kullanarak Nereye taşıdıysak oraya.
Ve sonra fset pozisyonu yine özellikle yazmak istediğimiz yere bir şey ayarlayın
ve ardından istediğimiz yerden yazabiliriz.
Yani tüm bu işlevlerle birlikte, nereye işaret ettiğinizi gerçekten görmek istersiniz.
Bu çok daha kolay hale gelecek meydan okumamızı anladıktan sonra.
Yani okuma ve yazma ile her zaman yazdığınız noktaya doğru bir yere gitmek
istersiniz.
Her zaman yazmak istemezsiniz başlangıç ya da son için.
Ve böylece bu fonksiyonlar çok bir dosyanın herhangi bir yerinde konumlandırmak istediğiniz
yere taşımak için kullanışlıdır.
Teşekkür ederim.