Satır Yönlenimli Girdi
Önceki XII. Oylum - Akımlar Üzerinde Giriş/Çıkış Sonraki
Satır Yönlenimli Girdi
Birçok yazılım girdiyi satır temelinde yorumladığından bir akımdan bir metin satırını okuyacak işlevlerin de bulunması yararlıdır.
Standart C bunu yapacak işlevlere sahiptir ama onlar çok güvenilir değildir: Boş karakterler ve hatta uzun satırlar (gets için) onları şaşırtabilir. Bu nedenle GNU kütüphanesi satırları güvenilir bir şekilde kolayca okumak için standart olmayan getline işlevini içerir.
Diğer bir GNU oluşumu olan getdelim işlevi, getline işlevini genelleştirir. İşlev belirtilmiş bir ayraç karakteriyle ayrılmış kayıtlardan bir kaydı okur.
Bu işlevlerin tümü stdio.h başlık dosyasında bildirilmiştir.
ssize_t getline
(char  **satır-gstr,
 size_t *n,
 FILE   *akım)
işlev
Bu işlev akım’daki bir tam satırı okur, metni satırsonu karakteri ve bir sonlandırıcı boş karakterle bir tampona yazar ve bu tamponun adresini *satır-gstr içinde saklar.
getline çağrısından önce, *n bayt uzunluğundaki malloc ile ayrılmış bir tamponun adresi *satır-gstr içine yerleştirilmelidir. Bu tampon yeterli uzunluktaysa, getline okuduğu satırı bu tampona yazar. Aksi takdirde getline işlevi realloc kullanarak tamponu büyütür ve yeni tampon adresini *satır-gstr argümanı ile ve arttırdığı uzunluğu *n argümanı ile geri döndürür. Bkz. Özgür Bellek Ayırma.
*satır-gstr olarak bir boş gösterici ve *n için 0 değerini vererek çağrı yaparsanız, getline işlevi malloc işlevini kullanarak tamponu sizin için ayırır.
Her iki durumda, getline döndüğünde, *satır-gstr satırın metnini gösteren bir char *’dır.
getline başarılı olduğunda okunan karakterlerin sayısı (satırsonu karakteri ve bir boş karakter dahil) ile döner. Bu değer satırın parçası olan boş karakterleri sonlandırıcı olarak eklenen boş karakterden ayırabilmenizi sağlar.
Bu işlev bir GNU oluşumudur ve bir akımdan satırları okumak için önerilen bir yoldur. Aynı amaçlı diğer standart işlevler güvenilir değildir.
Bir hata oluşursa ya da herhangi bir bayt okunmadan dosya sonuna gelinirse getline işlevi -1 ile döner.
ssize_t getdelim
(char  **satır-gstr,
 size_t *n,
 int     ayraç,
 FILE   *akım)
işlev
Bu işlev okumayı sonlandıran karakterin belirtilebilmesi dışında getline gibidir. ayraç argümanı ile ayraç karakteri belirtilir. İşlev bu karakteri görene kadar ya da bu karakter yoksa dosya sonunu görene kadar metni okur.
satır-gstr içinde saklanan metin ayraç karakterini ve sonlandırıcı olarak bir boş karakter içerir. getline gibi getdelim işlevi de gerekirse satır-gstr tamponunu büyütür.
getline bir getdelim işlevi ile aşağıdaki gibi gerçeklenebilir:
ssize_t
getline (char **lineptr, size_t *n, FILE *stream)
{
  return getdelim (lineptr, n, '\n', stream);
}
char *fgets
(char *s,
 int   kar-sayısı,
 FILE *akım)
işlev
fgets işlevi akım’dan bir satırı satırsonu karakterine kadar bu karakter de dahil olmak üzere okur ve s dizgesine sonuna bir boş karakter ekleyerek yerleştirir. s dizgesindeki alanı kar-sayısı karakterlik olarak belirtebilirsiniz, ancak okunan karakterlerin sayısı kar-sayısı - 1 olacaktır. Kalan son yer, dizgenin sonunu gösteren boş karakter için kullanılacaktır.
fgets çağrısı yaptığınızda sistem zaten dosyanın sonundaysa s dizisinin içeriği değiştirilmez ve bir boş gösterici döner. Bir okuma hatası olduğunda da boş gösterici döner. Aksi takdirde dönen değer s göstericisidir.
Uyarı
Girdi verisi bir boş karakter içeriyorsa bunu belirtemezsiniz. Bu nedenle, sadece verinin bir boş karakter içermediğini biliyorsanız fgets işlevini kullanın, yoksa kullanmayın. Kullanıcı tarafından düzenlenmiş dosyaları okumak için fgets kullanmayın, çünkü kullanıcı bir boş karakter girmişse ya onu olması gerektiği gibi okumanız ya da bir hata iletisi basmanız gerekir. Daha iyisi, fgets yerine getline kullanmanızı öneririz.
wchar_t *fgetws
(wchar_t *ws,
 int      kar-sayısı,
 FILE    *akım)
işlev
fgetws işlevi akım’dan geniş karakterleri satırsonu karakterine kadar bu karakter de dahil olmak üzere okur ve ws dizgesine sonuna bir boş karakter ekleyerek yerleştirir. ws dizgesindeki alanı kar-sayısı karakterlik olarak belirtebilirsiniz, ancak okunan geniş karakterlerin sayısı kar-sayısı - 1 olacaktır. Kalan son yer, dizgenin sonunu gösteren boş karakter için kullanılacaktır.
fgetws çağrısı yaptığınızda sistem zaten dosyanın sonundaysa ws dizisinin içeriği değiştirilmez ve bir boş gösterici döner. Bir okuma hatası olduğunda da boş gösterici döner. Aksi takdirde dönen değer ws göstericisidir.
Uyarı
Girdi verisi bir boş karakter içeriyorsa bunu belirtemezsiniz. Bu nedenle, sadece verinin bir boş karakter içermediğini biliyorsanız fgetws işlevini kullanın, yoksa kullanmayın. Kullanıcı tarafından düzenlenmiş dosyaları okumak için fgetws kullanmayın, çünkü kullanıcı bir boş karakter girmişse ya onu olması gerektiği gibi okumanız ya da bir hata iletisi basmanız gerekir.
char *fgets_unlocked
(char *s,
 int   kar-sayısı,
 FILE *akım)
işlev
fgets_unlocked işlevi akımı dolaylı olarak kilitlememesi dışında fgets işlevine eşdeğerdir.
Bu işlev bir GNU oluşumudur.
wchar_t *fgetws_unlocked
(wchar_t *ws,
 int      kar-sayısı,
 FILE    *akım)
işlev
fgetws_unlocked işlevi akımı dolaylı olarak kilitlememesi dışında fgetws işlevine eşdeğerdir.
Bu işlev bir GNU oluşumudur.
char *gets
(char *s)
önerilmeyen işlev
gets işlevi standart girdiden bir satırı satırsonu karakterine kadar okur ve s dizgesine yerleştirir. Satırsonu karakteri iptal edilir. (İşlev bu davranışı ile satırsonu karakterini de dizgeye yerleştiren fgets işlevinden faklıdır.) Bir okuma hatası olduğunda ya da dosya sonu saptandığında boş gösterici döner. Aksi takdirde dönen değer s göstericisidir.
Uyarı
gets işlevi çok tehlikelidir. Çünkü s dizgesinin taşmasına karşı bir korumaya sahip değildir. GNU kütüphanesi işlevi sadece uyumluluk adına içerir. Bunun yerine daima ya fgets ya da getline işlevini kullanmalısınız. Bunu hatırlatmak için ilintileyici (GNU ld kullanıyorsanız) gets kullanırsanız sizi uyaracaktır.
Önceki Üst Ana Başlık Sonraki
Karakter Girdilerinin Alınması Başlangıç Okunmamış Yapmak
Bir Linux Kitaplığı Sayfası