10 fungsi Built-In
11. Pustaka Standar
12.4 Fungsi File Yang Diperluas
Clib menyediakan fungsi file tambahan dan yang ditingkatkan berikut:
public extern ::fopen NAME MODE, fdopen FD MODE, freopen NAME MODE F; public extern fileno F;
public extern setvbuf F MODE; public extern fconv F CODESET; public extern tmpnam, tmpfile;
public extern ftell F, fseek F POS WHENCE; public rewind F;
public extern gets, fgets F; public extern fget F;
public extern ungetc C, fungetc F C;
Versi fopen clib menangani tanda `+' di dalam modus string-string, seperti itu membuka peluang anda untuk membuka file-file untuk membaca dan menulis. Modus "r+" membuka satu file yang ada untuk membaca dan menulis; isi-isi file inisial bersifat tanpa perubahan, dan penunjuk file masukan dan keluaran diposisikan pada awal file. modus "w+" membuat suatu file yang baru, atau memotongnya menjadi berukuran kosong jika itu telah ada, dan memposisikan penunjuk file pada awal file. modus "a+" menambahkan catatan kepada satu file yang ada (atau membuat yang baru); tongkat penunjuk file yang awal ditetapkan pada permulaan file untuk membaca, dan pada akhir file untuk menulis. Semua modus ini juga memasukkan kombinasi dengan tanda b (file biner).
Fungsi freopen seperti fopen, tetapi membuka kembali satu objek file yang ada di file yang lain. Seperti Halnya Dalam programming C, tujuan utama dari operasi ini adalah untuk memungkinkan pengguna untuk mengalihkan arah stream standar I/O yang dihubungan dengan proses interpreter (tersedia di dalam interpreter atas permintaan INPUT, KELUARAN dan ERROR variabel-variabel).
Fungsi fdopen membuka suatu objek file yang baru di suatu file descriptor yang diberikan, yang diberikan oleh modus itu adalah kompatibel. Dan sebaliknya, fungsi fileno mengembalikan file descriptor dari suatu obyek file. (Lihat juga fungsi-fungsi untuk file descriptor langsung yang memanipulasi di Low-Level I/O.)
Fungsi setvbuf menetapkan modus penyanggaan untuk suatu file (IONBF = tanpa penyanggaan, IOLBF = penyanggaan garis, IOFBF = penyanggaan penuh). Operasi ini harus dilibatkan segera setelah file dibuka, sebelum setiap operasi I/O dilaksanakan.
Fungsi fconv menetapkan pengkodean suatu file. Secara langsung, operasi I/O yang terikut pada Q seperti juga fungsi string clib I/O mengasumsikan pengkodean sistem, dan mengkonversi antara proses encoding ini dengan penyajian string UTF-8 yang internal jika dibutuhkan. Jika suatu file teks menggunakan satu pengkodean yang berbeda dari pengkodean sistem, anda dapat menggunakan fungsi fconv untuk membuat pengkodean yang diinginkan. CODESET harus string yang menandakan suatu pengkodean nama yang valid karena fungsi iconv (lihat juga Internasionalisasi, di bawah). Hal ini mempengaruhi semua operasi teks read/write yang berikut
di file. (Operasi ini hanya bekerja untuk Unicode-capable sistem yang sudah dinginstall iconv. catatan bahwa fungsi ini hanyalah tersedia bagi varsi Q 7.0 dan setelehnya.)
Fungsi Tmpnam dan tmpfile bekerja seperti halnya rutinitas-rutinitas C yang sesuai: tmpnam mengembalikan suatu nama yang unik untuk suatu file yang sementara, dan tmpfile membangun suatu file yang dibuka sementara di dalam modus "w+b", yang akan dihapus secara otomatis ketika itu ditutup. Lihat tmpnam(3) dan tmpfile(3) halaman-halaman manual untuk detil.
Fungsi Ftell/fseek digunakan untuk pemposisian file. Fungsi ftell mengembalikan posisi file yang ada, selagi fungsi fseek memposisikan file di posisi yang diberi. Fungsi rewind kembali menyediakan suatu peringkasan yang menyenangkan untuk memposisikan kembali file di permulaan. Operasi ini bekerja seperti halnya fungsi C yang sesuai. argument WHENCE dari fseek menentukan bagaimana argument POS ditafsirkan; dapat juga SEEK_SET (POS berhubungan dengan permulaan file, yaitu., satu posisi yang absolut), SEEK_CUR (POS berhubungan dengan posisi yang ada) atau SEEK_END (POS berhubungan dengan ujung file). Kemudian dua kasus POS dapat juga hal negatif.
catatan Portabilitas:
•Menurut spesifikasi C ISO, anda perlu menggunakan fflush atau fseek sebelum memindahkan antara membaca dan menulis di suatu file yang dibuka dengan tanda `+'.
•Di sistem non-unix, ftell dan fseek mungkin hanya pekerjaan yang dapat dipercaya jika file itu dibuka di dalam modus yang biner (tanda b).
Fungsi Gets/fgets bekerja seperti fungsi fgets di C, yaitu., mereka membaca satu baris dari masukan yang standar atau file yang diberi yang termasuk newline yang seret, bila ada. Fungsi fget membaca seluruh file dengan segera dan mengembalikannya sebagai suatu string. Fungsi Ungetc/fungetc menahan suatu karakter di masukan yang standar atau file masukan yang diberi, seperti fungsi ungetc di C. pustaka C hanya menjaminan bahwa menahan suatu karakter ASCII akan dikerjakan, sehingga hasil tentang menahan berbagai atau multibyte karakter-karakter adalah tergantung implementasi..
Lebih dari itu, alias-alias tambahan berikut disediakan untuk afficionados C:
public ::readc as getc, ::freadc F as fgetc;
public ::writes S as puts, ::fwrites F S as fputs; public ::writec C as putc, ::fwritec F C as fputc;
Contoh-contoh
buka suatu file yang baru untuk membaca dan menulis:
==> def F = fopen "test" "w+" Tulis suatu string ke file:
==> fwrites F "The little brown fox.\n" ()
Posisi yang ada di balik penulisan string (pada end-of-file):
==> ftell F 22
Rewind (pergi ke permulaan file):
==> rewind F ()
baca kembali string yang sudah kita tulis sebelumnya:
==> fgets F
"The little brown fox.\n"
Periksa bahwa kita berada lagi pada end-of-file:
==> feof F true
string Keluaran lain:
==> fwrites F "The second line.\n" ()
Posisi di balik string pertama:
==> fseek F 22 SEEK_SET ()
Baca kembali string yang kedua:
==> fgets F
"The second line.\n"
Dan di sini adalah bagaimana caranya membaca satu seluruh file teks serempak:
==> def T = fget (fopen "clib.q" "r")
Untuk dengan cepat menghitung suatu 32 bit checksum dari file:
==> sum (bytes (bytestr T)) mod 0x100000000 3937166
Akhirnya, marilah kita memotong teks ke dalam baris dan menambahkan nomor baris menggunakan sprintf (lihat C-Style Formatted I/O):
==> def L = split "\n" T
==> def L = map (sprintf "%3d: %s\n") (zip [1..#L] L) ==> do writes (take 5 L)
1:
2: /* clib.q: modul sistem Q's
4:
5: /* File ini menjadi bagian dari sistem program Q. ()