The INPUT keyword represents a fundamental file access specification within COBOL programming environments, providing read-only file opening capabilities that enable secure data retrieval, sequential processing, and efficient input operations. This keyword embodies the principles of controlled file access by supporting read-only operations, data integrity protection, and optimized input processing while maintaining file security, ensuring consistent data access patterns, and facilitating robust application development across enterprise systems requiring reliable data input, sequential file processing, and comprehensive data reading capabilities with optimal performance characteristics and secure access control mechanisms.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546*> Basic INPUT file opening OPEN INPUT file-name-1 [, file-name-2, ...] *> File Control Section ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS LINE SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-FILE-STATUS. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(6). 05 EMP-NAME PIC X(30). 05 EMP-SALARY PIC 9(7)V99. WORKING-STORAGE SECTION. 01 WS-FILE-STATUS PIC XX. 88 FILE-OK VALUE "00". 88 END-OF-FILE VALUE "10". PROCEDURE DIVISION. MAIN-PROCESSING. *> Open file for reading only OPEN INPUT EMPLOYEE-FILE IF FILE-OK DISPLAY "File opened successfully for INPUT" PERFORM READ-EMPLOYEES ELSE DISPLAY "Error opening file: " WS-FILE-STATUS END-IF CLOSE EMPLOYEE-FILE. READ-EMPLOYEES. READ EMPLOYEE-FILE AT END SET END-OF-FILE TO TRUE NOT AT END DISPLAY "Employee: " EMP-ID " " EMP-NAME END-READ.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480IDENTIFICATION DIVISION. PROGRAM-ID. INPUT-FILE-PROCESSING. ENVIRONMENT DIVISION. INPUT-OUTPUT SECTION. FILE-CONTROL. *> Sequential file for employee data SELECT EMPLOYEE-FILE ASSIGN TO "EMPLOYEE.DAT" ORGANIZATION IS LINE SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-EMP-STATUS. *> Sequential file for sales data SELECT SALES-FILE ASSIGN TO "SALES.DAT" ORGANIZATION IS LINE SEQUENTIAL ACCESS MODE IS SEQUENTIAL FILE STATUS IS WS-SALES-STATUS. *> Indexed file for product lookup SELECT PRODUCT-FILE ASSIGN TO "PRODUCT.IDX" ORGANIZATION IS INDEXED ACCESS MODE IS DYNAMIC RECORD KEY IS PROD-CODE FILE STATUS IS WS-PROD-STATUS. *> Report output file SELECT REPORT-FILE ASSIGN TO "REPORT.TXT" ORGANIZATION IS LINE SEQUENTIAL FILE STATUS IS WS-REPORT-STATUS. DATA DIVISION. FILE SECTION. FD EMPLOYEE-FILE. 01 EMPLOYEE-RECORD. 05 EMP-ID PIC 9(6). 05 EMP-NAME PIC X(30). 05 EMP-DEPARTMENT PIC X(15). 05 EMP-SALARY PIC 9(7)V99. 05 EMP-HIRE-DATE PIC 9(8). FD SALES-FILE. 01 SALES-RECORD. 05 SALE-ID PIC 9(8). 05 SALE-EMP-ID PIC 9(6). 05 SALE-PRODUCT PIC X(10). 05 SALE-AMOUNT PIC 9(8)V99. 05 SALE-DATE PIC 9(8). 05 SALE-COMMISSION PIC 9(6)V99. FD PRODUCT-FILE. 01 PRODUCT-RECORD. 05 PROD-CODE PIC X(10). 05 PROD-NAME PIC X(40). 05 PROD-PRICE PIC 9(6)V99. 05 PROD-CATEGORY PIC X(15). 05 PROD-VENDOR PIC X(20). FD REPORT-FILE. 01 REPORT-LINE PIC X(132). WORKING-STORAGE SECTION. 01 WS-FILE-STATUS-FIELDS. 05 WS-EMP-STATUS PIC XX. 88 EMP-FILE-OK VALUE "00". 88 EMP-EOF VALUE "10". 05 WS-SALES-STATUS PIC XX. 88 SALES-FILE-OK VALUE "00". 88 SALES-EOF VALUE "10". 05 WS-PROD-STATUS PIC XX. 88 PROD-FILE-OK VALUE "00". 88 PROD-NOT-FOUND VALUE "23". 05 WS-REPORT-STATUS PIC XX. 88 REPORT-OK VALUE "00". 01 WS-PROCESSING-FLAGS. 05 WS-PROCESSING-COMPLETE PIC X VALUE 'N'. 88 PROCESSING-DONE VALUE 'Y'. 88 MORE-PROCESSING VALUE 'N'. 01 WS-COUNTERS. 05 WS-EMPLOYEES-READ PIC 9(6) VALUE 0. 05 WS-SALES-READ PIC 9(8) VALUE 0. 05 WS-PRODUCTS-FOUND PIC 9(6) VALUE 0. 05 WS-RECORDS-PROCESSED PIC 9(8) VALUE 0. 01 WS-TOTALS. 05 WS-TOTAL-SALARY PIC 9(10)V99 VALUE 0. 05 WS-TOTAL-SALES PIC 9(12)V99 VALUE 0. 05 WS-TOTAL-COMMISSION PIC 9(10)V99 VALUE 0. 01 WS-WORK-AREAS. 05 WS-CURRENT-DATE PIC 9(8). 05 WS-REPORT-HEADER PIC X(80). 05 WS-DETAIL-LINE PIC X(80). PROCEDURE DIVISION. MAIN-PROCESSING. PERFORM INITIALIZE-PROCESSING PERFORM PROCESS-INPUT-FILES PERFORM GENERATE-REPORTS PERFORM FINALIZE-PROCESSING STOP RUN. INITIALIZE-PROCESSING. DISPLAY "=== INPUT FILE PROCESSING DEMONSTRATION ===" *> Open all input files OPEN INPUT EMPLOYEE-FILE IF NOT EMP-FILE-OK DISPLAY "Error opening Employee file: " WS-EMP-STATUS STOP RUN END-IF OPEN INPUT SALES-FILE IF NOT SALES-FILE-OK DISPLAY "Error opening Sales file: " WS-SALES-STATUS STOP RUN END-IF OPEN INPUT PRODUCT-FILE IF NOT PROD-FILE-OK DISPLAY "Error opening Product file: " WS-PROD-STATUS STOP RUN END-IF *> Open output file for reports OPEN OUTPUT REPORT-FILE IF NOT REPORT-OK DISPLAY "Error opening Report file: " WS-REPORT-STATUS STOP RUN END-IF ACCEPT WS-CURRENT-DATE FROM DATE YYYYMMDD DISPLAY "All files opened successfully" DISPLAY "Processing started on: " WS-CURRENT-DATE DISPLAY SPACES. PROCESS-INPUT-FILES. DISPLAY "=== PROCESSING INPUT FILES ===" PERFORM PROCESS-EMPLOYEE-DATA PERFORM PROCESS-SALES-DATA PERFORM CROSS-REFERENCE-PROCESSING DISPLAY "Input file processing completed" DISPLAY " Employees processed: " WS-EMPLOYEES-READ DISPLAY " Sales records processed: " WS-SALES-READ DISPLAY " Products referenced: " WS-PRODUCTS-FOUND DISPLAY SPACES. PROCESS-EMPLOYEE-DATA. DISPLAY "Processing Employee Input File..." PERFORM READ-EMPLOYEE-RECORD PERFORM UNTIL EMP-EOF ADD 1 TO WS-EMPLOYEES-READ ADD 1 TO WS-RECORDS-PROCESSED ADD EMP-SALARY TO WS-TOTAL-SALARY *> Process employee record PERFORM VALIDATE-EMPLOYEE-DATA PERFORM FORMAT-EMPLOYEE-OUTPUT PERFORM READ-EMPLOYEE-RECORD END-PERFORM DISPLAY "Employee file processing complete" DISPLAY " Records read: " WS-EMPLOYEES-READ DISPLAY " Total payroll: $" WS-TOTAL-SALARY. READ-EMPLOYEE-RECORD. READ EMPLOYEE-FILE AT END SET EMP-EOF TO TRUE NOT AT END CONTINUE END-READ. VALIDATE-EMPLOYEE-DATA. *> Validate employee data from INPUT file IF EMP-ID = 0 DISPLAY "Warning: Employee with zero ID found" END-IF IF EMP-SALARY = 0 DISPLAY "Warning: Employee " EMP-ID " has zero salary" END-IF IF EMP-HIRE-DATE = 0 DISPLAY "Warning: Employee " EMP-ID " missing hire date" END-IF. FORMAT-EMPLOYEE-OUTPUT. STRING "EMP: " EMP-ID " | " EMP-NAME " | " EMP-DEPARTMENT " | $" EMP-SALARY DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE. PROCESS-SALES-DATA. DISPLAY "Processing Sales Input File..." PERFORM READ-SALES-RECORD PERFORM UNTIL SALES-EOF ADD 1 TO WS-SALES-READ ADD 1 TO WS-RECORDS-PROCESSED ADD SALE-AMOUNT TO WS-TOTAL-SALES ADD SALE-COMMISSION TO WS-TOTAL-COMMISSION *> Process sales record PERFORM VALIDATE-SALES-DATA PERFORM LOOKUP-PRODUCT-INFO PERFORM FORMAT-SALES-OUTPUT PERFORM READ-SALES-RECORD END-PERFORM DISPLAY "Sales file processing complete" DISPLAY " Records read: " WS-SALES-READ DISPLAY " Total sales: $" WS-TOTAL-SALES DISPLAY " Total commission: $" WS-TOTAL-COMMISSION. READ-SALES-RECORD. READ SALES-FILE AT END SET SALES-EOF TO TRUE NOT AT END CONTINUE END-READ. VALIDATE-SALES-DATA. *> Validate sales data from INPUT file IF SALE-ID = 0 DISPLAY "Warning: Sales record with zero ID" END-IF IF SALE-AMOUNT = 0 DISPLAY "Warning: Zero amount sale ID: " SALE-ID END-IF IF SALE-EMP-ID = 0 DISPLAY "Warning: Sale " SALE-ID " has no employee ID" END-IF. LOOKUP-PRODUCT-INFO. *> Look up product information using INPUT file MOVE SALE-PRODUCT TO PROD-CODE READ PRODUCT-FILE KEY IS PROD-CODE INVALID KEY DISPLAY "Product not found: " SALE-PRODUCT NOT INVALID KEY ADD 1 TO WS-PRODUCTS-FOUND DISPLAY "Product found: " PROD-NAME " - $" PROD-PRICE END-READ. FORMAT-SALES-OUTPUT. STRING "SALE: " SALE-ID " | EMP: " SALE-EMP-ID " | PROD: " SALE-PRODUCT " | $" SALE-AMOUNT DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE. CROSS-REFERENCE-PROCESSING. DISPLAY "Performing cross-reference processing..." *> Reset file positions for second pass CLOSE EMPLOYEE-FILE CLOSE SALES-FILE OPEN INPUT EMPLOYEE-FILE OPEN INPUT SALES-FILE *> Cross-reference employees with their sales PERFORM READ-EMPLOYEE-RECORD PERFORM UNTIL EMP-EOF PERFORM FIND-EMPLOYEE-SALES PERFORM READ-EMPLOYEE-RECORD END-PERFORM. FIND-EMPLOYEE-SALES. *> Find all sales for current employee PERFORM READ-SALES-RECORD PERFORM UNTIL SALES-EOF IF SALE-EMP-ID = EMP-ID STRING "MATCH: " EMP-NAME " sold $" SALE-AMOUNT DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE END-IF PERFORM READ-SALES-RECORD END-PERFORM *> Reset sales file for next employee CLOSE SALES-FILE OPEN INPUT SALES-FILE. GENERATE-REPORTS. DISPLAY "=== GENERATING SUMMARY REPORTS ===" PERFORM WRITE-REPORT-HEADER PERFORM WRITE-SUMMARY-TOTALS PERFORM WRITE-STATISTICS DISPLAY "Report generation completed". WRITE-REPORT-HEADER. STRING "===== INPUT FILE PROCESSING SUMMARY =====" DELIMITED BY SIZE INTO WS-REPORT-HEADER MOVE WS-REPORT-HEADER TO REPORT-LINE WRITE REPORT-LINE STRING "Report Date: " WS-CURRENT-DATE DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE. WRITE-SUMMARY-TOTALS. STRING "FINANCIAL SUMMARY:" DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Total Payroll: $" WS-TOTAL-SALARY DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Total Sales: $" WS-TOTAL-SALES DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Total Commission: $" WS-TOTAL-COMMISSION DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE. WRITE-STATISTICS. MOVE SPACES TO REPORT-LINE WRITE REPORT-LINE STRING "PROCESSING STATISTICS:" DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Employees processed: " WS-EMPLOYEES-READ DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Sales processed: " WS-SALES-READ DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Products referenced: " WS-PRODUCTS-FOUND DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE STRING " Total records: " WS-RECORDS-PROCESSED DELIMITED BY SIZE INTO WS-DETAIL-LINE MOVE WS-DETAIL-LINE TO REPORT-LINE WRITE REPORT-LINE. FINALIZE-PROCESSING. DISPLAY "=== FINALIZING PROCESSING ===" CLOSE EMPLOYEE-FILE CLOSE SALES-FILE CLOSE PRODUCT-FILE CLOSE REPORT-FILE DISPLAY "All files closed successfully" DISPLAY "Processing completed with statistics:" DISPLAY " Total employees: " WS-EMPLOYEES-READ DISPLAY " Total sales: " WS-SALES-READ DISPLAY " Total records: " WS-RECORDS-PROCESSED DISPLAY "Report written to REPORT.TXT". *> Advanced INPUT processing patterns SEQUENTIAL-INPUT-PROCESSING. DISPLAY "=== SEQUENTIAL INPUT PROCESSING PATTERNS ===" *> Pattern 1: File validation before processing OPEN INPUT EMPLOYEE-FILE IF EMP-FILE-OK PERFORM VALIDATE-FILE-STRUCTURE IF FILE-STRUCTURE-VALID PERFORM PROCESS-VALID-FILE ELSE DISPLAY "File structure validation failed" END-IF ELSE DISPLAY "Cannot open file for INPUT" END-IF. BATCH-INPUT-PROCESSING. DISPLAY "=== BATCH INPUT PROCESSING ===" *> Process multiple input files in batch OPEN INPUT EMPLOYEE-FILE, SALES-FILE, PRODUCT-FILE PERFORM UNTIL ALL-FILES-PROCESSED PERFORM PROCESS-EMPLOYEE-BATCH PERFORM PROCESS-SALES-BATCH PERFORM CHECKPOINT-PROCESSING END-PERFORM. ERROR-HANDLING-INPUT. DISPLAY "=== INPUT ERROR HANDLING ===" *> Robust error handling for INPUT operations OPEN INPUT EMPLOYEE-FILE EVALUATE WS-EMP-STATUS WHEN "00" DISPLAY "File opened successfully" PERFORM NORMAL-PROCESSING WHEN "35" DISPLAY "File not found - using default data" PERFORM USE-DEFAULT-DATA WHEN "37" DISPLAY "File not available - retry later" PERFORM RETRY-PROCESSING WHEN OTHER DISPLAY "Unexpected error: " WS-EMP-STATUS PERFORM ERROR-RECOVERY END-EVALUATE. PERFORMANCE-OPTIMIZED-INPUT. DISPLAY "=== PERFORMANCE OPTIMIZED INPUT ===" *> Optimized reading with buffering OPEN INPUT EMPLOYEE-FILE PERFORM READ-EMPLOYEE-RECORD PERFORM UNTIL EMP-EOF *> Process record efficiently PERFORM FAST-RECORD-PROCESSING *> Read next record PERFORM READ-EMPLOYEE-RECORD END-PERFORM. VALIDATE-FILE-STRUCTURE. *> Validate that INPUT file has expected structure PERFORM READ-EMPLOYEE-RECORD IF EMP-FILE-OK IF EMP-ID NUMERIC AND EMP-NAME NOT = SPACES SET FILE-STRUCTURE-VALID TO TRUE ELSE SET FILE-STRUCTURE-INVALID TO TRUE END-IF ELSE SET FILE-STRUCTURE-INVALID TO TRUE END-IF.
123456789101112131415161718192021222324252601 CUSTOMER-FILE-STATUS PIC XX. 88 FILE-OK VALUE "00". 88 END-OF-FILE VALUE "10". PROCEDURE DIVISION. OPEN INPUT CUSTOMER-FILE IF FILE-OK PERFORM READ-ALL-CUSTOMERS ELSE DISPLAY "Error opening file" END-IF CLOSE CUSTOMER-FILE. READ-ALL-CUSTOMERS. READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ PERFORM UNTIL END-OF-FILE DISPLAY "Customer: " CUST-NAME READ CUSTOMER-FILE AT END SET END-OF-FILE TO TRUE END-READ END-PERFORM.
12345678910111213141516171819PROCEDURE DIVISION. *> Open multiple files for INPUT OPEN INPUT ORDERS-FILE, CUSTOMERS-FILE, PRODUCTS-FILE *> Process data from all files PERFORM CROSS-REFERENCE-DATA *> Close all INPUT files CLOSE ORDERS-FILE, CUSTOMERS-FILE, PRODUCTS-FILE. CROSS-REFERENCE-DATA. PERFORM UNTIL END-OF-ORDERS READ ORDERS-FILE AT END SET END-OF-ORDERS TO TRUE NOT AT END PERFORM LOOKUP-CUSTOMER PERFORM LOOKUP-PRODUCT END-READ END-PERFORM.
What is the purpose of opening a file with INPUT mode?
Answer: INPUT mode opens a file for reading operations only. It provides read-only access, protecting the file from accidental modification while allowing sequential or indexed reading of records.
What operations are NOT allowed on files opened with INPUT?
Answer: Files opened with INPUT cannot be written to, updated, or have records deleted. Only READ operations are permitted. WRITE, REWRITE, and DELETE operations will cause runtime errors.