Bir dosya üzerinde giriş ve çıkış işemleri yapmak isterseniz, yazılımınız ile dosya arasında bağlantıyı temsil eden şu iki temel mekanizmadan birini kullanmalısınız: Dosya tanımlayıcılar ve akımlar. Dosya tanımlayıcılar int türünden nesneler olduğu halde akımlar FILE * türünden nesnelerdir.
Dosya tanımlayıcılar girdi ve çıktı işlemleri için daha ilkel ve düşük seviyeli bir arayüzdür. Bir dosya tanıtıcısı veya bir akım normal bir dosya ile bağlantı kurmaktan başka, başka bir süreç ile iletişim kurmak için bir aygıt (örneğin, uçbirim), bir soket veya bir boruhattını da temsil edebilir. Ancak, belli bir aygıta özel işlemleri denetlemek isterseniz bir dosya tanımlayıcı kullanmak zorundasınız, akımları bu tür bir işlem için
kullanabilmenizi sağlayacak bir oluşum yoktur. Ayrıca, örneğin, bloklanamayan (ya da kutuplu) girdiler (
Dosya Durum Seçenekleri) gibi özel kiplerde girdi ve çıktı işlemlerine ihtiyaç duyarsanız yine dosya tanıtıcılarını kullanmak zorundasınız.
Akımlar, dosya tanımlayıcı oluşumlarına göre daha üst seviyede bir arayüzdür. Akımlar, bütün dosya çeşitleri için üç farklı tamponlama tarzı (
Akım Tamponlama) seçilebilmesi dışında hemen hemen aynıdır.
Akımları kullanmanın en büyük getirisi, dosya tanıtıcılar için sağlanan işlevlerden daha güçlü ve daha zengin girdi ve çıktı işlemi türününün (denetim işlemlerinin aksine) uygulanabilmesidir. Dosya tanımlayıcılar, karakter bloklarını aktarmak için basit işlevler içerirken akım arayüzü, daha güçlü biçimli girdi ve çıktı işlevleri (printf ve scanf) yanında karakter ve satır yölenimli girdi ve çıktı işlevlerini içerir.
Akımlar dosya tanımlayıcılar üzerine kurulduklarından bir akımdaki dosya tanımlayıcıyı çıkarıp düşük seviyeli işlemleri dosya tanımlayıcılar üzerinden uygulayabilirsiniz. Ayrıca, dahili olarak bir bağlantıyı dosya tanımlayıcı olarak açabilir ve bir akımı bu dosya tanımlayıcı ile ilişkilendirebilirsiniz.
Genelde, sadece dosya tanımlayıcılarla yapılabilen işlemleri yapmak dışında akımları kullanmayı tercih etmelisiniz. Başlangıç seviyesinde bir yazılımcı iseniz ve hangi işevi kullanacağınıza karar veremiyorsanız, biçimli girdi ve çıktı (
Biçimli Girdi ve
Biçimli Çıktı) işlevlerine yoğunlaşmanızı öneririz.
Yazılımınızın GNU dışındaki sistemlere taşınabilirliği ile ilgileniyorsanız, akımlar kadar taşınabilir olmayan dosya tanımlayıcı işlevlerinden uzak durmalısınız. ISO C çalışan her sistemde akımlara destek olduğunu umabilirsiniz, ama GNU dışı sistemler dosya tanımlayıcıların tamamını desteklemeyebilir veya dosya tanımlayıcılarla çalışan GNU işlevlerinin bir alt kümesini destekliyor olabilir. GNU kütüphanesindeki dosya tanımlayıcı işlevlerin çoğu yine de POSIX.1 standardındadır.