Fortran格式的IO和Null字符

时间:2018-06-27 12:25:33

标签: fortran

我想知道在使用NULL字符ACHAR(0)的情况下,Fortran的I / O应该如何工作。

实际的任务是用正好八个字符的块填充ASCII文件。这些字符串是从二进制文件读取的,可能包含非打印字符。

我尝试使用gfortran 4.8、8.1和f2c。如果字符串中包含NULL字符,格式说明符FORMAT(A8)不会写入八个字符。

尝试以下F77代码:

c Print a string of eight character surrounded by dashes
100   FORMAT('-',A8,'-')
c Works fine if empty or any other combination of printing chars
      write(*,100) ''
c In case of a short sting blanks are padded
      write(*,100) '345678'
c A NULL character does something I did not expect
      write(*,100) '123'//ACHAR(0)//'4567'
c Not even position editing helps
101   FORMAT('-',A8,T10,'x')
      write(*,101) '123'//ACHAR(0)//'4567'
      end

我的输出是:

-        -
-  345678-
-1234567-
-1234567x

这是预期的行为吗?知道如何在任何情况下使输出宽8个字符吗?

2 个答案:

答案 0 :(得分:1)

是的,如果有一个空字符,则可以在屏幕上停止字符串 的打印。仍将发送字符,但是不必在屏幕上打印字符串。

请注意,C使用NULL来分隔字符串,并且OS可以使用相同的约定解释它收到的字符串。允许处理器以处理器特定的方式解释不可打印的字符,并且处理器包括编译器,执行环境(OS和OS中的程序)以及硬件的整个复合体。

答案 1 :(得分:1)

使用编辑描述符A8时,字段宽度为8。为了输出,将写入八个字符。

在该示例中,不是您期望的字符写法,而是终端如何显示字符。

您可以使用hexdump之类的工具进一步检查输出,也可以写入内部文件并查看任意子字符串。