\n yeni satır ("new line") anlamına geliyor.
EOF ise kütük sonu ("End Of File") anlamına geliyor.
Yazmaya çalıştığımız uygulamayı anlamaya çalışalım.
Burada şöyle diyor.
Bir karakter oku.
Eğer okunan karakter Enter tuşu ve dosya sonu değilse yeni karakterler okumaya devam et.
Ve işleci arka planda aslında bir mantık kapısı kullanarak işlem yapar.
Buna VE kapısı diyoruz.
Elektronik, fiziksel bir donanımdır. Genelde gerçeklemesi Mosfet denilen devre elemanları kullanılarak yapılır.
Hem fiziksel olan VE kapısı hem de VE işleci için çalışma mantığını şu şekilde düşünebiliriz.

Bir lambaya seri bağlı anahtarlar var.
Lambanın yanması için bu anahtarların hepsini açık duruma "1" getirmek gerekiyor.
Eğer yüz tane seri anahtar olsa idi, lambanın yanabilmesi için yüzünün de açık olması gerekiyordu.
VE kapısının çalışma mantığı bu şekildedir.
Bir de meraktan VE kapısının gerçekleştirilmesine bakalım.

Şimdilik üstteki noktalı olan kısımları göz ardı edelim.
Sağ alt köşede mavi ile çizdiğimiz kısma bakalım. Üst kısım +5V alt kısım ise topraktır.
Sağ alt köşede bulunan örneğin üst kısmını bir lamba, A ve B'yi ise seri bağlı anahtarlar olarak düşünebiliriz.
Üstteki noktalı kısım ise tam tersi oluyor.
Diyelim ki alt kısımda A ve B seri ise, üst kısımda A ve B'yi paralel takıyoruz.
Yeşil daire ile gösterilen ise DEĞİL kapısı. Girişte 0 girilirse çıkışı 1 yapıyor.
VE kapısını, VE DEĞİL kapısının DEĞİLi şeklinde tasarlıyoruz.
Örneğimize geri dönelim.
Okuduğumuz karakter dosya sonu karakteri olsun.
karakter != '\n'
Bu durumda karakter satır sonu değil ifadesinin sonucu 1 çıkacak.
karakter != EOF
Karakter satır sonu değil ifadesinin sonucu ise 0 çıkacak.
Eğer arada VEYA işleci || kullansaydık sonuç 1 çıkacaktı.
Böylece döngü çalışmaya devam edecekti.
EOF'u kaldırıp denerseniz örneğin gene çalıştığını görebilirsiniz.
Satır sonu ve dosya sonu karakterlerini biraz daha açmaya çalışalım.
Bir hikayeden alınmış örnek bir metnimiz olsun :
Umara çok tembel bir çocuk idi.
Çokca zahmetten sonra kendisinin
ve oğlunun yiyeceğini kazanan
fakir annesiyle birlikte yaşıyordu.
Bu kütüğü sanırım şu şekilde düşünebiliriz.
Umara çok tembel bir çocuk idi.\nÇokca zahmetten sonra kendisinin\nve oğlunun yiyeceğini kazanan\nfakir annesiyle birlikte yaşıyordu.\n^Z
Buradaki \n ler yeni satır en sondaki karakter de satır sonunu gösteriyor.
stdio.h kütüğünde EOF şu şekilde tanımlanmış :
#define EOF (-1)
Dosya sonu kullanımını örnekleyen ufak bir örnek yazabiliriz.
Bu örnek girişten gelen karakterleri okuyup, tekrarlıyor. Dosya sonu girilirse çalışması sona eriyor.
// tekrarla.c
#include <stdio.h>
int main()
{
int okunan;
// okunan karakter dosya sonu olmadığı sürece yap
while ((okunan = getchar()) != EOF)
{
// tekrarla
putchar(okunan);
}
}
Bu uygulamayı çalıştırdığımızda çıktısı şu şekilde oldu.
./tekrarla
Çorba yapalım
Çorba yapalım
Ne çorbası
Ne çorbası
Mercimek
Mercimek
Girişi Ctrl-D ile sonlandırdık.
Her ne kadar basit bir uygulama gibi görünse de bizim kullandığımız işletim sisteminde kütüğe yazabilir ve okuyabilir.
./tekrarla > umara.txt
Umara fakir bir çocuktu.
Annesi ile beraber
yaşıyordu.
Yazılanları kütüğe yönlendiriyorum. Bakıyoruz.
Gerçekten yazmış mı?
cat umara.txt komutu ile kütük içeriğine bakıyoruz.
Umara fakir bir çocuktu.
Annesi ile beraber
yaşıyordu.
Benzer şekilde ./tekrarla < umara.txt şeklindeki kullanımda ise bir kütükten okuma yapabilir.
"C Primer Plus" isimli "Stephen Prata" nın yazdığı bir kitap var.
Kitabın 8. bölümünde bu konu anlatılıyor.