Verb Berkas Sekuensial

OPEN, READ, WRITE, REWRITE, dan CLOSE beserta AT END pada pemrosesan berkas sekuensial.

Daftar isi

Verb berkas sekuensial mengatur siklus hidup sebuah berkas mulai dari saat dibuka sampai ditutup, yaitu OPEN, READ, WRITE, REWRITE, dan CLOSE. Topik ini membahas empat mode OPEN beserta arah aksesnya, pola pembacaan sampai habis dengan READ AT END, penulisan record baru, dan pembaruan record dengan REWRITE. Setiap langkah didemonstrasikan oleh program yang benar-benar dijalankan, yaitu program penulis berkas jadwal piket, program pembacanya, dan program pengubah satu record di dalamnya. Setelah membacanya, siklus berkas sekuensial yang lengkap dapat dibangun tanpa menebak-nebak verb mana yang dipakai pada mode mana.

Mode OPEN dan arah pemrosesan#

OPEN adalah verb pertama yang dijalankan atas sebuah berkas, dan mode yang mengikutinya menentukan verb mana yang boleh dipakai sesudahnya. Mode INPUT membuka berkas untuk dibaca saja, sedangkan mode OUTPUT menyiapkan berkas baru untuk ditulis. Mode EXTEND membuka berkas yang sudah ada dan menempatkan posisi tulis di akhirnya, sehingga record baru menempel sesudah record lama. Mode I-O membuka berkas untuk dibaca dan ditulis sekaligus, dan mode inilah satu-satunya yang mengizinkan REWRITE. FILE STATUS yang dideklarasikan pada SELECT melengkapi keempat mode tersebut dengan kode dua digit atas setiap operasi.

ModeArah aksesCatatan penting
INPUTBaca sajaWRITE dan REWRITE tidak sah pada mode ini
OUTPUTTulis berkas baruIsi berkas lama dengan nama sama ikut hilang
EXTENDTulis di akhir berkasRecord lama dipertahankan dan tidak dapat dibaca
I-OBaca dan tulisSatu-satunya mode yang mengizinkan REWRITE

CLOSE menandai berakhirnya pemakaian berkas dan melepaskannya dari program. Kebiasaan yang benar adalah menutup berkas segera setelah selesai diproses, karena CLOSE yang berhasil memberi status 00 pada FILE STATUS dan memastikan seluruh data sudah tersimpan lengkap.

READ AT END dan pola baca sampai habis#

READ menyalin record berikutnya dari berkas ke area record yang didefinisikan pada FD, lalu memajukan posisi baca. Pada berkas sekuensial, kehabisan record bukan error melainkan keadaan yang dinanti, dan keadaan itu ditandai oleh frasa AT END. Frasa NOT AT END melengkapinya dengan pernyataan yang hanya dieksekusi apabila record berhasil dibaca, sehingga pemrosesan record dan penandaan akhir berkas terpisah dengan jelas. Pola baca sampai habis (end of file loop) memadukan keduanya dengan satu sakelar dan PERFORM UNTIL.

cobol Pola baca sampai habis dengan READ AT END
       BACA-SEMUA.
           OPEN INPUT berkas-piket.
           PERFORM UNTIL sw-akhir = "Y"
               READ berkas-piket
                   AT END
                       MOVE "Y" TO sw-akhir
                   NOT AT END
                       DISPLAY pk-nomor " " pk-nama " " pk-hari
               END-READ
           END-PERFORM.
           CLOSE berkas-piket.

Sakelar sw-akhir diisi N sebelum perulangan dan berubah menjadi Y tepat ketika AT END terpicu. Penempatan READ pada satu titik di dalam perulangan menjamin setiap record diproses tepat satu kali, dan tidak ada pembacaan tambahan setelah akhir berkas tercapai. Pola ini berulang pada hampir seluruh program batch, sehingga bentuknya cukup dikenali satu kali saja.

Program pertama membuat berkas piket.dat berisi lima record jadwal piket. Record terdiri atas nomor urut dua digit, nama sepuluh karakter, dan hari enam karakter, sehingga panjangnya tetap 18 karakter. Isi data disiapkan pada tabel WORKING-STORAGE, kemudian ditulis ke berkas satu per satu dengan WRITE.

cobol tulis-piket.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. TULIS-PIKET.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT berkas-piket ASSIGN TO "piket.dat"
               ORGANIZATION IS SEQUENTIAL
               FILE STATUS IS fs-piket.
       DATA DIVISION.
       FILE SECTION.
       FD  berkas-piket.
       01  r-piket.
           02 pk-nomor PIC 9(2).
           02 pk-nama  PIC X(10).
           02 pk-hari  PIC X(6).
       WORKING-STORAGE SECTION.
       01  fs-piket PIC XX.
       01  dt-piket.
           02 dt-baris OCCURS 5 TIMES.
               03 dt-nomor PIC 9(2).
               03 dt-nama  PIC X(10).
               03 dt-hari  PIC X(6).
       01  i PIC 9.
       PROCEDURE DIVISION.
       ISI-TABEL.
           MOVE "01Ali       Senin " TO dt-baris (1).
           MOVE "02Budi      Selasa" TO dt-baris (2).
           MOVE "03Citra     Rabu  " TO dt-baris (3).
           MOVE "04Dewi      Kamis " TO dt-baris (4).
           MOVE "05Eko       Jumat " TO dt-baris (5).
       TULIS-BERKAS.
           OPEN OUTPUT berkas-piket.
           PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
               MOVE dt-baris (i) TO r-piket
               WRITE r-piket
           END-PERFORM.
           CLOSE berkas-piket.
           DISPLAY "5 record ditulis ke piket.dat, status " fs-piket.
           STOP RUN.
text Keluaran
5 record ditulis ke piket.dat, status 00

Kompilasi program dengan perintah berikut, kemudian jalankan ./tulis-piket.

bash
# kompilasi program penulis berkas piket
cobc -x tulis-piket.cbl

Program kedua membaca ulang seluruh isi berkas dengan pola baca sampai habis yang diperkenalkan pada bagian sebelumnya.

cobol baca-piket.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. BACA-PIKET.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT berkas-piket ASSIGN TO "piket.dat"
               ORGANIZATION IS SEQUENTIAL
               FILE STATUS IS fs-piket.
       DATA DIVISION.
       FILE SECTION.
       FD  berkas-piket.
       01  r-piket.
           02 pk-nomor PIC 9(2).
           02 pk-nama  PIC X(10).
           02 pk-hari  PIC X(6).
       WORKING-STORAGE SECTION.
       01  fs-piket PIC XX.
       01  sw-akhir PIC X VALUE "N".
       PROCEDURE DIVISION.
       BACA-SEMUA.
           OPEN INPUT berkas-piket.
           PERFORM UNTIL sw-akhir = "Y"
               READ berkas-piket
                   AT END
                       MOVE "Y" TO sw-akhir
                   NOT AT END
                       DISPLAY pk-nomor " " pk-nama " " pk-hari
               END-READ
           END-PERFORM.
           CLOSE berkas-piket.
           DISPLAY "Status berkas setelah CLOSE: " fs-piket.
           STOP RUN.
text Keluaran
01 Ali        Senin 
02 Budi       Selasa
03 Citra      Rabu  
04 Dewi       Kamis 
05 Eko        Jumat 
Status berkas setelah CLOSE: 00

Kompilasi program kedua, kemudian jalankan ./baca-piket pada direktori yang sama dengan piket.dat.

bash
# kompilasi program pembaca berkas piket
cobc -x baca-piket.cbl

Keluaran dari kedua program saling melengkapi sebagai bukti siklus tulis dan baca. Lima record yang ditulis oleh program pertama muncul dengan urutan yang sama pada program kedua, dan status 00 setelah CLOSE menegaskan berkas ditutup dalam keadaan bersih. Spasi pengisi pada field PIC X tampil apa adanya pada DISPLAY, misalnya Ali diikuti spasi hingga batas sepuluh karakter, karena berkas sekuensial menyimpan record dalam panjang yang tetap dan tidak menghapus spasi pengisi tersebut.

REWRITE untuk memperbarui record#

REWRITE mengganti record yang terakhir dibaca dengan isi area record saat ini, sehingga pembaruan data tidak memerlukan penulisan ulang seluruh berkas. Syaratnya ada dua, yaitu berkas dibuka dengan mode I-O dan record yang dituju sudah berhasil dibaca pada pembukaan yang sama. Program berikut membaca dua record pertama, mengganti nama pada record kedua, menulis ulang record itu, lalu membuka ulang berkas sebagai pembuktian.

cobol ubah-piket.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. UBAH-PIKET.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.
           SELECT berkas-piket ASSIGN TO "piket.dat"
               ORGANIZATION IS SEQUENTIAL
               FILE STATUS IS fs-piket.
       DATA DIVISION.
       FILE SECTION.
       FD  berkas-piket.
       01  r-piket.
           02 pk-nomor PIC 9(2).
           02 pk-nama  PIC X(10).
           02 pk-hari  PIC X(6).
       WORKING-STORAGE SECTION.
       01  fs-piket PIC XX.
       01  sw-akhir PIC X VALUE "N".
       PROCEDURE DIVISION.
       UBAH-RECORD.
           OPEN I-O berkas-piket.
           READ berkas-piket.
           READ berkas-piket
               NOT AT END
                   MOVE "Farhan" TO pk-nama
           END-READ.
           REWRITE r-piket.
           DISPLAY "Record 02 kini: " pk-nomor " " pk-nama " " pk-hari.
           CLOSE berkas-piket.
       BUKTIKAN-ULANG.
           OPEN INPUT berkas-piket.
           PERFORM UNTIL sw-akhir = "Y"
               READ berkas-piket
                   AT END
                       MOVE "Y" TO sw-akhir
                   NOT AT END
                       DISPLAY pk-nomor " " pk-nama " " pk-hari
               END-READ
           END-PERFORM.
           CLOSE berkas-piket.
           DISPLAY "Status berkas setelah CLOSE: " fs-piket.
           STOP RUN.
text Keluaran
Record 02 kini: 02 Farhan     Selasa
01 Ali        Senin 
02 Farhan     Selasa
03 Citra      Rabu  
04 Dewi       Kamis 
05 Eko        Jumat 
Status berkas setelah CLOSE: 00

Kompilasi program ketiga, kemudian jalankan ./ubah-piket.

bash
# kompilasi program pengubah record piket
cobc -x ubah-piket.cbl

Baris pertama keluaran menunjukkan isi area record sesaat sesudah REWRITE, sedangkan lima baris berikutnya berasal dari pembacaan ulang seluruh berkas. Nama pada record nomor 02 berubah dari Budi menjadi Farhan, sedangkan empat record lainnya tetap utuh. Perhatikan bahwa REWRITE tidak menambah record baru, melainkan menimpa record yang ditunjuk oleh READ terakhir.

Kesalahan umum#

  • REWRITE dijalankan tanpa READ terlebih dahulu. Pada berkas yang dibuka I-O, verb ini hanya mengganti record yang ditunjuk oleh pembacaan terakhir, dan pelanggarannya tampil sebagai FILE STATUS 43. Baca record yang dituju, ubah field yang diperlukan, kemudian tulis ulang.
  • OPEN OUTPUT dipakai untuk menambah data pada berkas lama. Mode ini mengganti seluruh isi berkas, sehingga data lama hilang tanpa peringatan. Gunakan mode EXTEND untuk menambah record di akhir berkas yang sudah ada.
  • Perulangan baca berhenti sebelum AT END ditangani. READ yang diulang sesudah akhir berkas tanpa sakelar penghenti menghasilkan status berkas yang salah dan data yang tercetak ganda. Ikuti pola PERFORM UNTIL dengan sakelar yang diisi pada AT END.

Ringkasan#

  • Mode OPEN menentukan arah akses, yaitu INPUT untuk baca, OUTPUT untuk berkas baru, EXTEND untuk menambah di akhir, dan I-O untuk baca tulis sekaligus.
  • READ menyalin record berikutnya ke area record FD dan menandai kehabisan data melalui AT END, yang dipadukan dengan NOT AT END pada pola baca sampai habis.
  • REWRITE mengganti record terakhir yang dibaca, dengan syarat mode I-O dan pembacaan yang sah, sedangkan CLOSE menutup berkas dengan status 00.
  • Berkas sekuensial menyimpan record berdempetan dengan panjang tetap, sehingga spasi pengisi field tetap tersimpan di dalam berkas.

Referensi#