Lekcje modułu (2/2)
Operacje We/Wy na Plikach
Gdy plik zostanie powiązany i zadeklarowany w sekcji DATA DIVISION, możemy nim manipulować w sekcji PROCEDURE DIVISION. W COBOL-u zarządzanie cyklem życia plików odbywa się w standardowy i deklaratywny sposób: otwarcie, operacja (odczyt lub zapis) i zamknięcie.
1. Otwieranie plików: Instrukcja OPEN
Przed rozpoczęciem odczytu lub zapisu pliku należy go otworzyć, wskazując odpowiedni tryb dostępu:
OPEN INPUT SALES-FILE.
Główne tryby dostępu to:
INPUT: Plik jest otwierany tylko do odczytu. Plik musi istnieć na dysku, w przeciwnym razie program zgłosi błąd.OUTPUT: Plik jest otwierany do zapisu. Jeśli plik już istnieje, jego poprzednia zawartość zostanie usunięta (nadpisanie). Jeśli nie istnieje, zostanie utworzony.EXTEND: Plik jest otwierany w celu dodawania danych (append). Nowe rekordy będą dopisywane od końca istniejącego pliku.I-O: Plik jest otwierany zarówno do odczytu, jak i do zapisu (stosowany głównie do plików o dostępie relatywnym lub indeksowanym, nie do sekwencyjnych plików liniowych).
2. Odczyt danych: Instrukcja READ
Do odczytania rekordu z pliku sekwencyjnego służy instrukcja READ. Ponieważ nie wiemy z góry, ile rekordów zawiera plik, należy zawsze obsłużyć warunek końca pliku (EOF - End Of File) przy użyciu klauzuli AT END:
READ SALES-FILE
AT END MOVE "Y" TO WS-EOF
END-READ.
READ SALES-FILE: Zauważ, że instrukcja odwołuje się do nazwy logicznej pliku (zdefiniowanej wSELECTiFD), a nie do rekordu.AT END: Określa instrukcje do wykonania przy próbie odczytu poza ostatni dostępny rekord. Zazwyczaj ustawia się flagę (taką jakWS-EOF) na wartość"Y".END-READ: Jawnie kończy instrukcję odczytu.
3. Zapisywanie danych: Instrukcja WRITE
Do dodawania danych do pliku służy instrukcja WRITE.
[!WARNING] W COBOL-u odczytuje się plik (
READ SALES-FILE), ale zapisuje rekord (WRITE SALES-RECORD). ZapisWRITE SALES-FILEto częsty błąd składniowy uniemożliwiający kompilację.
MOVE 1001 TO EMP-ID.
MOVE "MARIO ROSSI" TO EMP-NAME.
WRITE SALES-RECORD.
Przed wykonaniem instrukcji WRITE pola podrzędne struktury grupowej rekordu FD (w tym przypadku SALES-RECORD) muszą zostać odpowiednio uzupełnione w pamięci.
4. Zamykanie plików: Instrukcja CLOSE
Po zakończeniu przetwarzania każdy otwarty plik musi zostać obowiązkowo zamknięty, aby zwolnić zasoby systemowe i upewnić się, dass wszystkie dane zostały faktycznie zapisane na dysku:
CLOSE SALES-FILE.
Zauważ, że instrukcja CLOSE przyjmuje jako argument nazwę logiczną pliku (a nie rekordu).
Spróbuj sam
Uzupełnij PROCEDURE DIVISION, otwierając plik SALES-FILE w trybie INPUT, odczytując pierwszy rekord i ustawiając zmienną WS-EOF na 'Y' po osiągnięciu końca pliku. Na koniec pamiętaj o zamknięciu pliku przed zakończeniem programu.
Pokaż wskazówkę
Napisz w kolejności: OPEN INPUT SALES-FILE. potem READ SALES-FILE AT END MOVE 'Y' TO WS-EOF END-READ. potem CLOSE SALES-FILE. i na końcu STOP RUN.
Rozwiązanie dostępne po 3 próbach
Uzupełnij PROCEDURE DIVISION, otwierając plik SALES-FILE w trybie OUTPUT. Przenieś wartość 1001 do pola SALES-ID oraz 250.50 do pola SALES-AMOUNT, a następnie zapisz rekord SALES-RECORD w pliku. Na koniec zamknij plik przed zatrzymaniem programu.
Pokaż wskazówkę
Otwórz plik za pomocą OPEN OUTPUT SALES-FILE., użyj MOVE do nadania wartości polom SALES-ID i SALES-AMOUNT, wykonaj WRITE SALES-RECORD. (zapisując rekord, nie plik!), zamknij plik za pomocą CLOSE SALES-FILE. i zakończ za pomocą STOP RUN.
Rozwiązanie dostępne po 3 próbach