Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
COBOL读取顺序行文件,计数字符_Cobol - Fatal编程技术网

COBOL读取顺序行文件,计数字符

COBOL读取顺序行文件,计数字符,cobol,Cobol,在COBOL中,我从顺序行文件中读取数据。一行接一行,到EOF,诸如此类 read bank-file at end move 'Y' to end-of-bank 行的长度从40到80个字符不等。我需要知道,每行有多少个字符。但行可以以空格结尾,我也需要计算。所以我不能从程序中的变量中提取字符串的长度。READ语句是否有返回值,返回从已读行返回的字符数(直到达到CRLF)?Edit 如注释中所述,实际上可以读取字符数(字节),实际上,记录根据

在COBOL中,我从顺序行文件中读取数据。一行接一行,到EOF,诸如此类

           read bank-file  at end
            move 'Y'  to end-of-bank
行的长度从40到80个字符不等。我需要知道,每行有多少个字符。但行可以以空格结尾,我也需要计算。所以我不能从程序中的变量中提取字符串的长度。READ语句是否有返回值,返回从已读行返回的字符数(直到达到CRLF)?

Edit 如注释中所述,实际上可以读取字符数(字节),实际上,
记录根据
子句的不同而变化:

环境部。
输入输出部分。
文件控制。
选择一些文件
分配给“someFile.txt”
组织是按行顺序的。
数据司。
文件部分。
FD文件
记录范围为40到80,具体取决于某一行的长度。
01一些一线图X(80)。
工作和储存科。
77一些直线长度图9(3)。
现在,对于每次读取,记录长度存储到
SOME-LINE-length

READ SOME-FILE NEXT RECORD
DISPLAY SOME-LINE-LENGTH
我不知道到底是哪家供应商支持它(可能几乎所有),但至少它可以与ACUCOBOL一起使用


原职 据我所知,对于执行
read
语句读取的字节数没有反馈。显然,字节会立即存储到
文件部分的文件描述符所描述的记录中

但是,您可以通过计算写入记录的字符数来计算读取的字节数。
首先,将文件记录初始化为
低值。然后读下一条记录;这将移动读取到记录中的字节数。当读取的字节数小于记录大小时,记录末尾的字节保持不变

MOVE LOW-VALUES TO YOUR-RECORD
READ YOUR-FILE NEXT RECORD
PERFORM VARYING SOME-COUNTER FROM 72 BY -1 UNTIL (SOME-COUNTER < 0)
    IF NOT (YOUR-RECORD(SOME-COUNTER : 1) = LOW-VALUES)
        EXIT PERFORM
    END-IF
END-PERFORM
将低值移动到您的记录
在下一个记录中读取您的文件
将某些计数器从72变为-1,直到(某些计数器<0)
如果不是(您的记录(某些计数器:1)=低值)
退出表演
端到端IF
末端执行
SOME-COUNTER
将包含行长度,假设文件中不存在
NUL

我想当行的数量很大时,这会很耗时,但至少你得到了行的长度


如前所述,由于您没有提供更多细节,我不得不做出一些假设


我自己正在Windows 10上运行MicroFocus ACUCOBOL-GT。

如果您仍然不知道有多少字节,请尝试以下操作:

unix/linux/PC上的cobol的奇妙之处在于,在大多数情况下,他们不检查文件结构,他们认为您足够聪明,可以告诉程序文件是什么,对于复杂的文件,例如嵌入在文件中的MFCobol B树索引,文件头将完成其余工作

我第一次接触MFCobol时,用户总是会收到损坏的文件,我们需要一种快速了解错误的方法,因此我利用这一事实,基本上解析文件以寻找某些功能,例如x'0A(UNIX)或CR/LF,它会告诉我们有人使用二进制传输将文件从PC FTP传输到LINUX。它完全按照我们希望的那样做了,我们最终将其作为最终用户utillity发布

基于此,您可以告诉文件它有1个字节的记录,并将每个字节作为二进制序列读取。这将允许您在字节经过时对其进行计数。将文件定义更改为二进制顺序,记录大小为picx(01)。由于您声明记录终止符为CR/LF,因此需要一个2字节的字段来进行模式识别,并减少分隔符的字节数

SELECT SOME-FILE
    ASSIGN TO "someFile.txt"
    ORGANIZATION IS BINARY SEQUENTIAL.

 DATA DIVISION.
 FILE SECTION.

 FD SOME-FILE
    01 SOME-BYTE PIC X(01).

 WORKING-STORAGE SECTION.
 01 PATTERN-BUFFER.
    05  PB-01  PIC X(01).
    05  PB-02  PIC X(01).
 01  BYTE-COUNT      PIC 9(9) VALUE ZERO.
 01  END-OF-SOME-FILE   PIC X(01) VALUE IS "N"

PROCEDURE DIVISION.
MAIN.
  open SOME-FILE.
  READ SOME-FILE INTO SOME-BYTE
  AT END
     CLOSE SOME-FILE
     DISPLAY  "BYTE-COUNT: 0"
     STOP RUN
  NOT AT END
      MOVE 1 TO BYTE-COUNT
      PERFORM UNTIL END-OF-SOME-FILE="Y"
         READ SOME-FILE       **  (1 byte record)
           AT END MOVE "Y" TO END-OF-SOME-FILE
              DISPLAY BYTE-COUNT
              STOP RUN
           NOT AT END
              ADD 1 to BYTE-COUNT
              MOVE PB-02 to PB-01 
              MOVE SOME-BYTE TO PB-02
              IF PATTERN-BUFFER = x'0D0A'
                 SUBTRACT 2 FROM BYTE-COUNT
              ELSE
                 IF PB-01 = x'00" AND PB-02 < X'20'   <<=== SEE NOTE
                    SUBTRACT 1 FROM BYTE=COUNT
                 END-IF
              END-IF
         END-READ
     END-PERFORM
END-READ
选择一些文件
分配给“someFile.txt”
组织是二进制顺序的。
数据司。
文件部分。
FD文件
01多字节picx(01)。
工作和储存科。
01模式缓冲区。
05 PB-01图X(01)。
05 PB-02图X(01)。
01字节计数PIC 9(9)值为零。
01某些文件的结尾PICX(01)值为“N”
程序司。
梅因。
打开一些文件。
将某个文件读入某个字节
最后
关闭一些文件
显示“字节计数:0”
停跑
不在最后
移动1到字节计数
执行到某些文件的结尾=“Y”
读取文件**(1字节记录)
在末尾,将“Y”移动到某个文件的末尾
显示字节计数
停跑
不在最后
将1添加到字节计数
将PB-02移动到PB-01
将一些字节移动到PB-02
如果PATTERN-BUFFER=x'0D0A'
从字节计数中减去2
其他的

如果PB-01=x'00“您是否尝试过PB-02FD infle记录因infle记录长度而异。
这可能会为您的ACUCOBOL程序节省一点计算时间。注意
NULL
,它与
LOW-VALUE
x“00”
不同,
NULL
引用的是指针的内容,而不是零字节。@briantifin使用ACUCOBOL,将值设置为
NULL
将用
NUL
字节填充变量的所有字节,如果没有