MainframeMaster

COBOL Tutorial

COBOL INPUT Keyword

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.

INPUT Mode Usage

File Opening with INPUT
cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
*> 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.
Read-Only
File Access
Sequential

Comprehensive INPUT Examples

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
IDENTIFICATION 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.

INPUT Mode Characteristics

Advantages
  • • Read-only access protects data
  • • Efficient sequential processing
  • • No write permission required
  • • Safe for concurrent access
  • • Optimal for data analysis
Limitations
  • • Cannot modify records
  • • No write operations allowed
  • • Sequential access only (for sequential files)
  • • Cannot append data
  • • File must exist to open

Interactive Tutorial

Hands-On Exercise: INPUT File Processing
Practice using INPUT mode for various file processing scenarios

Exercise 1: Basic Sequential Reading

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
01 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.

Exercise 2: Multiple INPUT Files

cobol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
PROCEDURE 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.

Best Practices

Knowledge Check

Test Your Understanding

Question 1: Mode Purpose

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.

Question 2: Restrictions

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.

Related Pages