1

そのような構造体で .dat ファイルを読み取る方法: ( A = ALPHANUMERIC && N = NUM​​ERIC )

0AAAAAAAANNNN (233 BLANK SPACES ) 999999 ( SEQUENTIAL NUMBER ONE BY ONE )
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
1NNNNNNNNNNNNAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA (194 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)
9 (245 BLANK SPACES) 999999 (SEQUENTIAL NUMBER ONE BY ONE)

ですから、これを C/C++ または C# で読み取るプログラムを作成する方法は知っていますが、勉強のために Cobol で作成しようとしています....

しかし、このスタイルでファイルを開くためにどのコマンドを使用する必要があるのか​​ わかりません(私は知っているだけです:

ORGANIZATION IS LINE SEQUENTIAL.

カスタム命令で開く別のコマンドが存在すると思います...わかりません...では、ファイルを開いて情報を読み取るにはどうすればよいですか??

(1 行目を時間通りに読む必要があるだけで、2 行目と 3 行目を読む必要があります... 4 と 5 && 6 と 7 && 8 と 9 ...) そして、それを示したいと思います。 DISPLAY付きの情報(勉強のためだけに)ありがとう:)

4

3 に答える 3

2

FDの下に次のようなものがあります:

01  INPUT-RECORD.
    05  IR-RECORD-TYPE PIC X.
        88  INPUT-RECORD-IS-HEADER VALUE '0'.
        88  INPUT-RECORD-IS-DATA1 VALUE '1'.
        88  INPUT-RECORD-IS-DATA2 VALUE '2'.
        88  INPUT-RECORD-IS-TRAILER VALUE '9'.
    05  FILLER PIC X(whatever).

レコード区切り文字の「末尾」バイトが必要になる場合がありますが、わかりません。長さが異なるように見えるため、長さを整理する必要があります。

これらは Working-Storage にあります:

01  INPUT-RECORD-HEADER.
    05  IRH-RECORD-TYPE PIC X.
    05  IRH-ITEM1 PIC X(8).
    05  IRH-ITEM2 PIC 9(4).
    05  FILLER PIC X(233).
    05  IRH-SEQUENCE PIC X(6)
01  INPUT-RECORD-DATA1.
    05  IRD1-RECORD-TYPE PIC X.
    05  IRD1-ITEM1 PIC 9(14).
    05  IRD1-ITEM1 PIC X(19).
    05  FILLER PIC X(194).
    05  IRD1-SEQUENCE PIC X(6)
01  INPUT-RECORD-DATA2.
    05  IRD2-RECORD-TYPE PIC X.
    05  IRD2-ITEM1 PIC X(33).
    05  FILLER PIC X(194).
    05  IRD2-SEQUENCE PIC X(6)
01  INPUT-RECORD-TRAILER.
    05  IRT-RECORD-TYPE PIC X.
    05  FILLER PIC X(245).
    05  IRT-SEQUENCE PIC X(6).

一度に 1 つずつ、各レコードを読み取る必要があります。それを識別します。正しい WS 定義に入れます。「2」を読み取ると、「2」とともに保存した「1」を処理できます。

あなたのデータが何であるかわからないので、私のデータ名はあまり良くありません。また、定義を「フォーマット」していません。これにより、より読みやすくなります。

于 2013-01-28T22:39:32.220 に答える
1

OpenCOBOL の場合、標準入力/標準出力フィルター プログラムのサンプルを次に示します。

   >>SOURCE FORMAT IS FIXED
  *> ***************************************************************
  *><* ===========
  *><* filter
  *><* ===========
  *><* :Author:    Brian Tiffin
  *><* :Date:      20090207
  *><* :Purpose:   Standard IO filters
  *><* :Tectonics: cobc -x filter.cob
  *> ***************************************************************
   identification division.
   program-id. filter.

   environment division.
   configuration section.

   input-output section.
   file-control.
       select standard-input assign to keyboard.
       select standard-output assign to display.

   data division.
   file section.
   fd standard-input.
       01 stdin-record     pic x(32768).
   fd standard-output.
       01 stdout-record    pic x(32768).

   working-storage section.
   01  file-status         pic x  value space.
       88 end-of-file             value high-value
          when set to false is          low-value.

  *> ***************************************************************
   procedure division.
   main section.
   00-main.

   perform 01-open

   perform 01-read

   perform
        until end-of-file
            perform 01-transform
            perform 01-write
            perform 01-read
   end-perform
   .

   00-leave.
   perform 01-close
   .

   goback.
  *> end main

   support section.
   01-open.
   open input standard-input
   open output standard-output
   .

   01-read.
   read standard-input
        at end set end-of-file to true
   end-read
   .

  *> All changes here
   01-transform.
   move stdin-record to stdout-record
   .
  *>

   01-write.
   write stdout-record end-write
   .

   01-close.
       close standard-input
       close standard-output
   .

   end program filter.
  *><*
  *><* Last Update: dd-Mmm-yyyy

これは、たまたまテキスト ファイルを読み込んだ LINAGE の使用例です。

  *****************************************************************
  * Example of LINAGE File Descriptor
  * Author: Brian Tiffin
  * Date:   10-July-2008
  * Tectonics: $ cocb -x linage-demo.cob
  *            $ ./linage-demo <filename ["linage-demo.cob"]>
  *            $ cat -n mini-report
  *****************************************************************
   IDENTIFICATION DIVISION.
   PROGRAM-ID. linage-demo.

   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
      select optional data-file assign to file-name
          organization is line sequential
          file status is data-file-status.
      select mini-report assign to "mini-report".

   DATA DIVISION.
   FILE SECTION.
   FD  data-file.
   01  data-record.
      88 endofdata        value high-values.
      02 data-line        pic x(80).
   FD  mini-report
      linage is 16 lines
          with footing at 15
          lines at top 2
          lines at bottom 2.
   01  report-line         pic x(80).

   WORKING-STORAGE SECTION.
   01  command-arguments   pic x(1024).
   01  file-name           pic x(160).
   01  data-file-status    pic 99.
   01  lc                  pic 99.
   01  report-line-blank.
      02 filler           pic x(18) value all "*".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(34)
          VALUE "THIS PAGE INTENTIONALLY LEFT BLANK".
      02 filler           pic x(05) value spaces.
      02 filler           pic x(18) value all "*".
   01  report-line-data.
      02 body-tag         pic 9(6).
      02 line-3           pic x(74).
   01  report-line-header.
      02 filler           pic x(6) VALUE "PAGE: ".
      02 page-no          pic 9999.
      02 filler           pic x(24).
      02 filler           pic x(5) VALUE " LC: ".
      02 header-tag       pic 9(6).
      02 filler           pic x(23).
      02 filler           pic x(6) VALUE "DATE: ".
      02 page-date        pic x(6).

   01  page-count          pic 9999.

   PROCEDURE DIVISION.

   accept command-arguments from command-line end-accept.
   string
      command-arguments delimited by space
      into file-name
   end-string.
   if file-name equal spaces
      move "linage-demo.cob" to file-name
   end-if.

   open input data-file.
   read data-file
      at end
          display
               "File: " function trim(file-name) " open error"
          end-display
          go to early-exit
   end-read.

   open output mini-report.

   write report-line
      from report-line-blank
   end-write.

   move 1 to page-count.
   accept page-date from date end-accept.
   move page-count to page-no.
   write report-line
      from report-line-header
      after advancing page
   end-write.

   perform readwrite-loop until endofdata.

   display
      "Normal termination, file name: "
      function trim(file-name)
      " ending status: "
      data-file-status
   end-display.
   close mini-report.

  * Goto considered harmful?  Bah!  :)
   early-exit.
   close data-file.
   exit program.
   stop run.

  ****************************************************************
   readwrite-loop.
   move data-record to report-line-data
   move linage-counter to body-tag
   write report-line from report-line-data
      end-of-page
          add 1 to page-count end-add
          move page-count to page-no
          move linage-counter to header-tag
          write report-line from report-line-header
              after advancing page
          end-write
   end-write
   read data-file
      at end set endofdata to true
   end-read
   .

  *****************************************************************
  * Commentary
  * LINAGE is set at a 20 line logical page
  *  16 body lines
  *   2 top lines
  *   A footer line at 15 (inside the body count)
  *   2 bottom lines
  * Build with:
  * $ cobc -x -Wall -Wtruncate linage-demo.cob
  * Evaluate with:
  * $ ./linage-demo
  * This will read in linage-demo.cob and produce mini-report
  * $ cat -n mini-report
  *****************************************************************
   END PROGRAM linage-demo.

これらのサンプルと Gilbert の回答があれば、問題に取り組むのに十分なはずですが、これらの例は適切なエラー処理が苦手であることに注意してください。標準入出力の例、またはコマンド ライン引数 (または引数がない) に応じたファイル名別の例については、OpenCOBOL FAQ の ocdoc.cob プログラムを参照してください。

オフトピック: ocdoc.cob 自体に対する ocdoc パスの出力は、http://opencobol.add1tocobol.com/ocdoc.html で見ることができます( なぜそれについて言及するのですか? Pygments の COBOL レキシコン ハイライターがメインに受け入れられたばかりです。バージョン 1.6 以降では、COBOL (コンテキストフリー) 字句強調表示が可能になります。)

于 2013-01-28T20:42:24.847 に答える
0

ファイルを読み取る通常の COBOL プログラムを作成します。

レコードの最初のバイト (文字) は、0、1、2、または 9 のいずれかです。

4 つのレコード タイプのそれぞれについて、Working-Storage 領域 (01 レベル) を定義します。次に、レコードを読み取った後、それを入力領域からレコードの適切な作業場所領域に移動します。

次に、4 つのワーキング ストレージ エリアのいずれかからレコードを処理します。

于 2013-01-28T20:14:15.200 に答える