2013-04-16 149 views
1

我有,我可以使用C用下面的代码如何读取二进制文件,可读性于C,Fortran中

int it,ix; 
    double par1,par2,par3,par4,par5,par6; 

    fp = fopen("my_binary_file", "r"); 
    assert(fp != NULL); 
    fscanf(fp, "%d %lf %lf %lf \n",&it, &par1, &par2, &par3); 
    fscanf(fp, "%d %lf %lf %lf \n",&ix, &par4 ,&par5,&par6); 

我试图与该位读取相同的文件Fortran 90中读出的二进制文件代码

real(kind=8):: par1,par2,par3,par4,par5,par6 
    integer :: it,ix 

    open(1,file='my_binary_file',form='unformatted') 

    read(1) it,par1,par2,par3 
    read(1) ix,par4,par5,par6 

但是我得到了文件结尾错误。我试着一起读两条线

read(1) it,par1,par2,par3,ix,par4,par5,par6 

我读了一些东西,但参数不是我所期望的。这意味着我正在读取错误的字节或者变量的声明是错误的。你认为你可以帮忙吗?

+0

在你的C例子中,你传递给'fscanf'的参数以'%'开始是格式说明符。在你的FORTRAN代码中,你告诉编译器它将读取的是UNFORMATTED - 你需要计算出FORTRAN格式指定符是什么,并将它们提供给FORTRAN代码中的open命令。 – MoonKnight

回答

1

在C面

1)您的C二进制文件应该已经开辟为“RB”为一个二进制读。 2)fscanf不用于读取二进制文件。他们通常使用fread读取。 3)如果有效,假设它是一个文本文件

在Fortran方面, 4)由于它是一个文本文件,所以表单应该是'FORMATTED'。 5)在Fortran中读取每个文件后,文件指针移至下一行。这与C中的行为不同。 6)如果您不希望混淆格式语句,请使用自由格式读取来获取数据。

1

你的C代码看起来不像读取通常所说的二进制文件。如果它是C二进制文件,则必须使用STREAM输入,而不是SEQUENTIAL,这是您隐式使用的。只需尝试正常的格式化列表导向输入。

open(10,file='my_binary_file') 

read(10,*) it,par1,par2,par3 
read(10,*) ix,par4,par5,par6 

如果文件中有更多的内容显示它。