2010-07-07 17 views
5

Stdin/stdout'tan veri okuma/yazma için çeşitli yollar arıyorum. Şu anda scanf/printf, getchar/putchar ve gets/kozları biliyorum. Bunu yapmanın başka yolları var mı? Ayrıca, hangisinin Bellek ve Uzay açısından en verimli olduğunu bilmek ilginç. PeşinC/I yöntemleri

Teşekkür

+6

böyle C programlama dili olarak bir kitap okuyun yaklaşık Curses (Windows üzerinde daha fazla * NIX tarafında uygulanabilir değil, aynı zamanda mevcut) unutma ani mod türü şeyler arıyorsanız. Ve I/O işlemleri normalde CPU bağlı değildir. –

cevap

2

stdio oldukça olarak tasarlanmıştır Verileri okumak için hangi yolu seçerseniz seçin. Karakter-karakterli okuma ve yazma işlemlerini yapmanız gerekiyorsa, genellikle tam/boş olduğunda arabelleğe erişen makrolara genişlerler. Satır içi metin için puts/fputs ve fgets kullanın. (Ama NEVERgets kullanın, çünkü ne kadar çok bayt okuyacağını kontrol etmenin bir yolu yoktur!) printf ailesi (örneğin fprintf), metin için yazmadan önce geçici bir arabellek oluşturmayı atlamanıza izin verdiği için elbette metin için son derece yararlıdır (ve böylece tüm bellek ayırma, taşma, vb. konular hakkında düşünmekten kaçınmanıza izin verir). fscanf, daha az kullanışlı olma eğilimindedir, ancak çoğunlukla kullanımı zor olduğu için. fscanf belgelerini iyi çalışıp %[, %n ve sayısal belirticilerin nasıl kullanılacağını öğrenmek istiyorsanız çok güçlü olabilir!

Büyük metin blokları (örneğin, tüm dosyayı belleğe yükleme) veya ikili veriler için, fread ve fwrite işlevlerini de kullanabilirsiniz. Sayı bağımsız değişkeni için 1'i ve sayım bağımsız değişkenini okumak/yazmak için bayt sayısını geçmelisiniz; Aksi takdirde, ne kadar başarılı bir şekilde okunan veya yazıldığına dair dönüş değerinden bahsetmek imkansızdır.

Eğer makul POSIX benzeri sistemler (hemen hemen bir şey) üzerinde çalışıyorsanız, ayrıca daha düşük düzeyde io fonksiyonları open, read, write kullanabilirsiniz vb Bunlar C standardının ancak parçanın DEĞİL parçası POSIX ve POSIX olmayan sistemler genellikle aynı işlevleri sağlar, ancak muhtemelen biraz farklı davranışlarla (örneğin, dosya tanımlayıcıları POSIX'in gerektirdiği gibi sıralı olarak 0,1,2 numaralandırılmamış olabilir).