GNU sistemlerinde dosya konumlaması tamamen karakter sayısıdır. fseek veya fseeko işlevine konumu karakter sayısı olarak belirtebilir ve herhangi bir rasgele erişimli dosyada düzgün sonuçlar alabilirsiniz. Ancak ISO C sistemlerinde dosya konumlaması bu şekilde değildir.
Bazı sistemlerde metin akımları ikilik akımlardan tamamen farklıdır ve bir metin akımının dosya konumunu dosyanın başlangıcından itibaren karakterlerin sayısı olarak belirtmek mümkün değildir. Örneğin bazı sistemlerde önce dosya içindeki kaydın konumuna oradan da kayıt içindeki karakter konumuna erişilir.
Sonuç olarak, eğer yazılımınızın bu sistemlere taşınabilir olmasını isterseniz bazı kurallara uymanız gerekir:
Bir metin akımında ftell işlevinden dönen değer, o ana kadar okunan karakterlerin sayısıyla bire bir ilişkili değildir. Tek bir şeyden emin olunabilir: fseek veya fseeko işlevinin konum argümanına aynı değerleri ardışık kullanarak geriye aynı dosya konumuna gidebilirsiniz.
Bir metin akımında bir fseek veya fseeko çağrısında ya konum sıfır olmalı ya da nereden argümanının değeri SEEK_SET olmalı ve konum aynı akım üzerinde bir önceki ftell çağrısının sonucu olmalıdır.
Bir metin akımının dosya konumlayıcı değeri, bu karakterler, onları okunmamış ya da iptal edilmemiş yapan
ungetc ile geriye basılmışsa tanımsızdır. Bkz.
Okunmamış Yapmak.
Bu kurallara uysanız bile uzun dosyalarda hala bazı sorunlarınız olabilir, çünkü ftell ve fseek dosya konumu için long int değer kullanır. Bu tür, büyükçe bir dosyadaki tüm dosya konumlarına erişmek için yeterli olmayabilir. ftello ve fseeko işlevlerinin kullanımı off_t türünü kullanmalarından ötürü tüm dosya konumlarına erişmeya yardımcı olabileceği umulsa bile hala, bir dosya konumu ile ilişkili ek bilgileri elde etmekte yardımı olmayacaktır.
Bu durumda, dosya konumu için özel kodlamalar kullanılan sistemlere destek vermek isterseniz, bunlar yerine fgetpos ve fsetpos işlevlerini kullanmanız daha iyi olur. Bu işlevler dosya konumunu belirtmek için dahili genişliği sistemden sisteme değişiklik gösteren fpos_t veri türünü kullanırlar.
Bu semboller
stdio.h başlık dosyasında bildirilmiştir.
fgetpos ve fsetpos işlevlerinde kullanmak üzere, bir akımın dosya konumu hakkındaki bilgileri kodlayan bir nesnenin türüdür.
GNU sisteminde, fpos_t, dosya konumunu içeren dahili veriyi ve dönüşüm durum bilgilerini tutan bir veri yapısıdır. Diğer sistemlerdeki görüntüsü farklı olabilir.
Kaynaklar, 32 bitlik sistemlerde _FILE_OFFSET_BITS == 64 ile derlendiğinde büyük dosya desteği arayüzü eski arayüzün yerine geçtiğinden bu veri türü fpos64_t türüne eşdeğer olur.
fgetpos64 ve fsetpos64 işlevlerinde kullanmak üzere, bir akımın dosya konumu hakkındaki bilgileri kodlayan bir nesnenin türüdür.
GNU sisteminde, fpos64_t, dosya konumunu içeren dahili veriyi ve dönüşüm durum bilgilerini tutan bir veri yapısıdır. Diğer sistemlerdeki görüntüsü farklı olabilir.
int fgetpos | (FILE *akım,
fpos_t *konum) |
işlev
Bu işlev akım akımının dosya konum değerini konum ile gösterilen fpos_t nesnesinde saklar. Başarı durumunda fgetpos sıfır ile döner, aksi halde gerçeklemeye bağlı bir pozitif değeri errno değişkeninde saklayarak sıfırdan farklı bir değerle döner.
Kaynaklar, 32 bitlik sistemlerde _FILE_OFFSET_BITS == 64 ile derlendiğinde büyük dosya desteği arayüzü eski arayüzün yerine geçtiğinden bu işlev fgetpos64 işlevine eşdeğer olur.
int fgetpos64 | (FILE *akım,
fpos64_t *konum) |
işlev
Bu işlev dosya konumunu konum ile gösterilen fpos64_t türünde bir değişken içinde döndürmesi dışında fgetpos işlevi gibidir.
Kaynaklar, 32 bitlik sistemlerde _FILE_OFFSET_BITS == 64 ile derlendiğinde büyük dosya desteği arayüzü eski arayüzün yerine geçtiğinden bu işlev fgetpos ismiyle de kullanılabilir.
int fsetpos | (FILE *akım,
const fpos_t *konum) |
işlev
Bu işlev, aynı akım üzerinde bir önceki fgetpos işlevinden dönen konum değeriyle akım akımının dosya göstericisini konumlandırır. Başarı durumunda fsetpos akım üzerindeki dosyasonu göstergesini temizler, ungetc kullanımıyla geriye basılan karakterleri iptal eder ve sıfır değeriyle döner. Aksi takdirde, gerçeklemeye göre errno değişkenine bir pozitif değer atar ve sıfırdan farklı bir değerle döner.
Kaynaklar, 32 bitlik sistemlerde _FILE_OFFSET_BITS == 64 ile derlendiğinde büyük dosya desteği arayüzü eski arayüzün yerine geçtiğinden bu işlev fsetpos64 işlevine eşdeğer olur.
int fsetpos64 | (FILE *akım,
const fpos64_t *konum) |
işlev
Bu işlev dosya konumlamasında kullanılacak konum parametresinin fpos64_t türünde bir değişken olarak verilmesi dışında fsetpos ile aynıdır.
Kaynaklar, 32 bitlik sistemlerde _FILE_OFFSET_BITS == 64 ile derlendiğinde büyük dosya desteği arayüzü eski arayüzün yerine geçtiğinden bu işlev fsetpos ismiyle de kullanılabilir.