首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >读取未格式化文件的Fortran到C的翻译

读取未格式化文件的Fortran到C的翻译
EN

Stack Overflow用户
提问于 2016-02-11 01:42:31
回答 2查看 168关注 0票数 0

我正在努力将一小段Fortran代码翻译成C语言。我有一个以二进制格式编写的文件和一个可以读取这种格式的Fortran程序。我的目标是拥有一个能够读取相同格式的C程序。我对Fortran完全陌生,并且我没有该格式的原始规范。所以,这是一种逆向工程的过程。

代码语言:javascript
复制
filename = 'file'
integer :: status
integer, parameter :: di=selected_int_kind(9)
integer(di) :: nn

OPEN(11,file = filename, status = 'old', action = 'read', form = 'unformatted', iostat = status)
if(status /= 0) then
   write(*,*) 'FILE ERROR: '//filename
   stop
endif
read(11) nn
CLOSE(11)

真正让我感到困惑的一件事是selected_int_kind()语句。它到底是做什么的?在C语言中,什么是等价的?

实际上,我第一次尝试翻译的结果与@JohnBode的答案几乎相同,但并不起作用。它读取了一个完全不正确的值。

经过几次尝试,我找到了一个可行的解决方案,然而,我不明白为什么会这样。由于某些原因,正确的值被写入第5-8个字节。因此,我既可以读取两个int值(其中第二个将是正确的值),也可以读取一个long值,然后右移32位。你知道为什么Fortran可以如此轻松地检索正确的值吗?

EN

回答 2

Stack Overflow用户

发布于 2016-02-11 01:49:18

Fortran中的类型有一种类型,因为相同的类型(在本例中为整型)可能具有不同的“风格”(有点像C中的short、long、signed、unsigned等)。这些类型都是整数:例如,请参阅列表here。表达式种类的意思是:最小整数种类的种类数是什么,它可以包含-1e9到1e9之间的值(参见解释here)。

在C语言中,我猜signed int应该没问题,因为即使是4个字节(32位)也会从-2^312^31-1,这比所需的要宽一点。

票数 1
EN

Stack Overflow用户

发布于 2016-02-11 02:19:27

这接近于1:1的转换。

代码语言:javascript
复制
const char *filename = "file"; // or const char filename[] = "file";
long nn;

FILE *input = fopen( filename, "rb" ); // open as binary
if ( !input ) // or if ( input == NULL )
{
  fprintf( stderr, "FILE ERROR: %s\n", filename );
  exit(0);
}

if ( fread( &nn, sizeof nn, 1, input ) < 1 )
{
  fprintf( stderr, "Error while reading input\n" );
}

fclose( input );  

C没有与上面的"selected_int_kind“等价的类型;相反,您可以选择适当的类型来表示预期的值范围(即,shortintlonglong long等)。如果您需要能够表示9个十进制数字,那么普通的int可能不够宽(尽管在实践中应该足够宽),因此您可能应该使用long

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35322254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档