Fortran 格式的 IO 和 Null 字符



我想知道在空字符ACHAR(0)的情况下,Fortran的I/O应该如何表现。

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

我尝试使用gfortran4.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

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

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

在本例中,与您的期望相反的不是字符的书写,而是终端如何显示它们。

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

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

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

最新更新