Tidak, ini bukan perilaku POSIX, itu perilaku ISO (well, itu adalah perilaku POSIX tetapi hanya sejauh mereka sesuai dengan ISO).
Output standar adalah buffer line jika dapat dideteksi untuk merujuk ke perangkat interaktif, jika tidak buffered sepenuhnya. Jadi ada situasi di mana printf
tidak akan memerah, bahkan jika mendapat baris baru untuk dikirim, seperti:
myprog >myfile.txt
Ini masuk akal untuk efisiensi karena, jika Anda berinteraksi dengan pengguna, mereka mungkin ingin melihat setiap baris. Jika Anda mengirim output ke file, kemungkinan besar tidak ada pengguna di ujung yang lain (meskipun bukan tidak mungkin, mereka mungkin mengekor file). Sekarang Anda dapat berdebat bahwa pengguna ingin melihat setiap karakter tetapi ada dua masalah dengan itu.
Yang pertama adalah tidak efisien. Yang kedua adalah bahwa mandat ANSI C asli adalah untuk mengkodifikasi perilaku yang sudah ada , daripada menciptakan perilaku baru , dan keputusan desain dibuat jauh sebelum ANSI memulai proses. Bahkan ISO saat ini melangkah dengan sangat hati-hati ketika mengubah aturan yang ada dalam standar.
Bagaimana cara menghadapinya, jika Anda fflush (stdout)
setelah setiap panggilan panggilan yang ingin Anda lihat segera, itu akan menyelesaikan masalah.
Sebagai alternatif, Anda dapat menggunakan setvbuf
sebelum beroperasi pada stdout
, untuk mengaturnya untuk tidak dibangun dan Anda tidak perlu khawatir menambahkan semua fflush
baris ke kode Anda:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Hanya perlu diingat bahwa dapat mempengaruhi kinerja cukup sedikit jika Anda sedang mengirim output ke file. Juga perlu diingat bahwa dukungan untuk ini adalah implementasi yang ditentukan, tidak dijamin oleh standar.
Bagian ISO C99 7.19.3/3
adalah bit yang relevan:
Ketika sungai adalah unbuffered , karakter dimaksudkan untuk muncul dari sumber atau di tempat tujuan secepat mungkin. Kalau tidak, karakter dapat diakumulasikan dan dikirim ke atau dari lingkungan host sebagai blok.
Ketika aliran sepenuhnya buffered , karakter dimaksudkan untuk dikirim ke atau dari lingkungan host sebagai blok ketika buffer diisi.
Ketika aliran buffer line , karakter dimaksudkan untuk dikirim ke atau dari lingkungan host sebagai blok ketika karakter baris baru ditemui.
Selain itu, karakter dimaksudkan untuk ditransmisikan sebagai blok ke lingkungan host ketika buffer diisi, ketika input diminta pada stream yang tidak dikonstruksikan, atau ketika input diminta pada jalur buffered stream yang membutuhkan transmisi karakter dari lingkungan host .
Dukungan untuk karakteristik ini ditentukan oleh implementasi, dan dapat dipengaruhi melalui setbuf
dan setvbuf
fungsinya.