我想知道在空字符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
这是预期行为吗?知道如何在任何情况下获得八个字符宽的输出吗?
使用编辑描述符A8
字段宽度为 8。 对于输出,将写入八个字符。
在本例中,与您的期望相反的不是字符的书写,而是终端如何显示它们。
您可以使用hexdump
等工具进一步检查输出,也可以写入内部文件并查看任意子字符串。
是的,这是意料之中的,如果有空字符,则屏幕上字符串的打印可以停止。字符仍将发送,但字符串不必打印在屏幕上。
请注意,C 使用 NULL 来分隔字符串,操作系统可能会使用相同的约定解释它收到的字符串。允许处理器以处理器特定的方式解释不可打印的字符,并且处理器包括编译器,执行环境(操作系统和操作系统中的程序(和硬件的整个复合体。