PDA

Tam Sürümünü Görmek İçin : stdarg.h ve okuma yazma hakkinda..


Genjuro
28/06/2003, 17:55
Öncelikle Forum'a yeni katildigim icin herkese merhabalar ve iyi çalismalar..

Lafi cok fazla döndürmeden konuma girmek istiyorum.. Kendi basina 5 6 aydir C ile ugrasan bi adamim cok programli bi sekilde calismadim simdi bunun zararlarini cekiyorum kitabimdaki bölümlerin anlayabildigim kadarini anladim anlayamadigimi sonra bakarim dedim ve iste onlardan 2 tanesi..

Okudugum kitapda stdarg.h ile fonksiondan fonksiona farkli sayida par. aktarimi hakkinda ne dorudurst örnek nede o sekilde bi aciklama yok sizden ricam cok kücük bir source kode yada bu konuda detayları ve örnek code'lari bol olan bi url vermeniz..

Buna ilaveten kütüklerden okuma yazma etc.. bunları kitabin anlattigi çerçeve icerisinde tamamen örendim ancak kitapda göremedigim bir nokta var oda şu Diyelim ben 1 program yazicam bu program bir dokuman'ı acip icinden benim tarif ettigim yerdeki bir kelime, cümle yada paragrafi alip ekrana basicak veya herneyse sorun degil bu kisim bunu cözmüs degilim kısacasi 1 text dosyasinin icinde
14'üncü satirin tam ortasinda olan bir X rakam yada harfini ben programima onun dosyadaki yerini belirterek onu ordan okutmak istiyorum bu konudada bilgilendirirseniz sevinirim...
Teşekkurler
İyi çalıimalar
Dil ANSI C


ee++
28/06/2003, 19:48
Değişken sayıda argüman alan işlevlere verilebilecek en iyi örnek printf()'tir. Bir işlevin üzerinde işlem yapacağı öge sayısı belli değilse ya da 'olduğu kadarı üzerinde' işlem yapacaksa değişken sayıda argüman alması çözüm yöntemidir. Şimdi printf()'e benzer (içinde de printf()'i kullanan) bir örnek vereceğim:

void print_num(int argc, ...) {
va_list ap;

va_start(ap, argc);
while (argc--)
printf("%d%c", va_arg(ap, int), ((argc) ? ' ' : '\n'));

va_end(ap);
}

Su sekilde de kullanimi orneklenebilir:

print_num(1, 1);
print_num(5, 10, 3, 7, 5, 1);
print_num(0);
print_num(10, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3);

Bu islev parametre olarak aldığı sayılırı standart çıkışa basıyor. İlk parametre basılacak olan sayı sayısını gösteriyor. Diğer parametrelerin ise her biri basılacak bir sayı oluyor. Bunların sayısı 0 da olabilir.

Simdi stdarg.h'taki 3 işlevin tanımını vereyim:

void va_start(va_list ap, lastarg);

Değişken sayıda olan parametrelerden herhangi birine ilk erişimden önce çağrılmaı gereken ilklendirme işlevidir. 'ap' yerel bir değişken olarak tanımlanmalıdır. 'lastarg' ise isimlendirilmiş (değişken sayılı kısımdan önceki) son değişkendir (Bizim örneğimizde argc olmalıdır bu.)


type va_arg(va_list ap, type);

Değişken kısımdaki parametrelerden birisini (sıradakini) type ile belirtilen tipte döndürür. 'ap' nin her çağrılışta değiştiği göz ardı hatırlanmalıdır.


void va_end(va_list ap);

İş sonunca bir kere çağrılmalıdır.


İkinci soruya gelince, bir kütüğün 14. satırını okumak için. 14. satıra gitmek gerekir. Bu da 13 kere gets() gibi bir işelv çağırmayla mümkün olabilir. Kütük göstergesine doğrudan 14'ü satıra git deme şansımız yoktur, çünkü göstergemiz bayt bayt ilerler. Ancak, eğer her bir satırın kaçar bayt olduğu biliyorsak, o toplam değeri fseek() işlevini çağırarak istediğimiz yere gidebiliriz.

Kolayu gelsin.

burakco
19/02/2006, 15:57
fseek(dosya değişkeni, kayıt pozisyonu, referans noktası)

dosya değişkeni : diskteki dosyayı, programda temsil eden değişkenin adı
kayıt pozisyonu : kayıtların başlangıcından, okuyucu veya yazıcı kafanın bulunduğu noktadan yada kayıtların sonundan itibaren, byte olarak, kayıt yapacak veya kayıt okuyacak alan.
referans noktası: kaayıt pozisyonunun nereden itibaren başlayacağını gösterir. 0 - 1 - 2 değerlerini alabilir.

0 : kayıt pozisyonu, dosyanın başından itibaren byte cinsinden hesaplanır. o yerine SEEK_SEST yazılabilir.

1: kayıt pozisyonunun, yazıcı yada okuyucu kafanın bulunduğu noktadan itibaren hesaplanacağını gösterir. 1 yerine SEEK_CUR yazılabilir.

2: kayıt pozisyonu dosyanın sonundan itibaren byte cinsinden hesaplanır. 2 yerine SEEK_END yazılabilir.

fseek komutunu bu şekilde kullanabilirsin ;)