【问题标题】:Convert from binary to ASCII Fortran从二进制转换为 ASCII Fortran
【发布时间】:2014-01-05 02:27:18
【问题描述】:

我尝试使用 fortran 将 input_file.binary 转换为数字 output_file.txt(或者如果有人有其他想法:pyton、java、c++ ...)。 ascii 文件是一个 11 行 N 列的文件,只有数字(即:1e-21, 0.0, 1 ....)。

我试试这个帖子ASCii to BInary Conversion Program in java,但这与我的想法有点不同:我想读取二进制文件并编写一个 output_file.dat,所以我尝试使用这个 fortran 代码:

 program binary
 implicit none

    integer :: i, n
    real, allocatable :: data(:,:)
    open(20,file="input.dat",status="unknown",err=88)
    n = 0
    do
        read(20,*,end=1)
        n = n+1
    end do
    1 rewind(20)
    allocate(data(n,11))
    OPEN(10, file="output_file.txt")
    do i = 1, n
        read(20,*) data(i,:)
        write(10,*) data(i,:)
    end do
    close(20)

 end program binary

当我想用nano file.binary 检查文件时,输出是这样的:

^@^@^@^@^@^@^@^C^@^@^A�^@^@^@^A^@^@^@^A^@^R�M0wc�6 �7�^@^@^@^FA0^@^@^@^@^@^@^@^@^‌​@^@^@^@^@^@^@^@^@^@@ �e^A^@^@^@^B+�^[2/[��^@^@^@^FAI�#$

我可以编译该程序,但是当我尝试运行它时,我收到以下错误消息:

forrtl: 严重 (59): 列表导向 I/O 语法错误,单元 20,文件 /.../input.dat 图像 PC 例程线源 ascii 0805D0AA 未知 未知 未知 ascii 0805B14D 未知 未知 未知 ascii 0804A1EA 未知 未知 未知 ascii 08049E67 未知 未知 未知 libc.so.6 B75CF4D3 Unknown Unknown Unknown

非常感谢您的帮助。

【问题讨论】:

  • 如果ascii 文件有数字作为文本,那么重新创建文本文件的目的是什么?如果文件有二进制数,那么它不是ascii。请澄清,或显示input.dat的内容。
  • 当我尝试使用“nano input.dat”命令打开 input.dat 文件时,内容如下:
  • ^@^@^@^@^@^@^@^C^@^@^A�^@^@^@^A^@^@^@^A^@^ R�M0wc�6�7�^@^@^@^FA0^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ^@@�e^A^@^@^@^B+�^[2/[��^@^@^@^FAI�#$ 很多这个值但是当我打开这个程序(swiftvis)时将 ascii 转换为 txt 我看到了正确的数字。
  • 请更新您的问题。输入文件类型是二进制,不是 ASCII.
  • 尝试用hhdsoftware.com/free-hex-editor打开它并显示为浮动。这将确认二进制文件的格式。

标签: fortran ascii gfortran non-ascii-characters fortran95


【解决方案1】:

你写 ascii 文件是一个 11 行 N 列,然后像这样分配一个数组:

allocate(data(n,11))

这使得data 成为n-row、11-column 数组,这似乎转置了文件中的维度。如果您正在逐个元素地读取输入文件,这可能不会导致运行时系统引发错误,尽管它可能会给您留下您想要的数组的转置。

但是,您逐行读取输入文件。正如您所解释的那样,文件应该有 11 行数据,但您的程序尝试读取(和写入)n 行。同样,到目前为止,您的程序实际上并没有什么问题,尽管它可能没有按照您的预期进行。

但是您的程序希望输入文件中的每一行提供 11 个值,我猜它没有,导致您报告的错误。

【讨论】:

  • 是的,这是一个我没有看到的错误,现在我检查一下,当我尝试运行程序“./ascii”时,我收到以下错误:
  • forrtl: 严重 (59): list-directed I/O syntax error, unit 20, file /.../input.dat Image PC Routine Line Source ascii 0805D0AA Unknown Unknown Unknown ascii 0805B14D Unknown Unknown Unknown ascii 0804A1EA Unknown Unknown Unknown ascii 08049E67 Unknown Unknown Unknown libc.so.6 B75CF4D3 Unknown Unknown Unknown
  • 永远不要在评论中添加任何您希望别人阅读的内容,尤其是需要仔细格式化以提高可读性的代码或输出。编辑您的问题。
  • 最后我用 f.90 代码解决了我的问题。所以这个帖子可以关了。谢谢大家!!!
猜你喜欢
  • 2016-10-02
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2012-03-30
相关资源
最近更新 更多