Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+;中读取直接访问fortran未格式化文件+; 我目前正在尝试C++读取FORTRAN编写的二进制文件,但我没有太多的成功。编写文件的FORTRAN代码不是我自己的,尽管C++解析例程是.< /P>_C++_Fortran - Fatal编程技术网

在C+;中读取直接访问fortran未格式化文件+; 我目前正在尝试C++读取FORTRAN编写的二进制文件,但我没有太多的成功。编写文件的FORTRAN代码不是我自己的,尽管C++解析例程是.< /P>

在C+;中读取直接访问fortran未格式化文件+; 我目前正在尝试C++读取FORTRAN编写的二进制文件,但我没有太多的成功。编写文件的FORTRAN代码不是我自己的,尽管C++解析例程是.< /P>,c++,fortran,C++,Fortran,已使用以下语句写入二进制文件的第一条记录: 执行成功读取的Fortran代码段如下所示: open(unit=10,file="ETC.bin",access='direct',recl=24,iostat=iost,status='old') read (unit=10,rec=1) var1,var2,var3 close(unit=10) print*,var1,var2,var3 在C++方面,我至今提出如下: FILE* binfile = fopen("ETC.bin","rb")

已使用以下语句写入二进制文件的第一条记录:

执行成功读取的Fortran代码段如下所示:

open(unit=10,file="ETC.bin",access='direct',recl=24,iostat=iost,status='old')
read (unit=10,rec=1) var1,var2,var3
close(unit=10)
print*,var1,var2,var3
在C++方面,我至今提出如下:

FILE* binfile = fopen("ETC.bin","rb") ;
fseek (binfile,0,SEEK_END) ;
long lSize = ftell (binfile) ;
char* buffer = (char*) malloc (sizeof(char)*lSize) ;
rewind (binfile) ;
size_t result=fread(buffer,1,96,binfile) ;
for (unsigned i = 0; i<=result; i++){
   printf("%f\n",buffer[i]) ;
}
选项在编译时是必需的

<>我知道结果应该是什么,但是我不知道如何复制C++中FORTRAN读语句的行为。 谢谢你的帮助


还有一个类似的问题贴在这里:,它指向以下几点。没有太多的信息,或者我的Google Fu很糟糕。

我的C语言不是很好,但我尝试了一些东西

首先是Fortran部分:

program direct_access
    implicit none
    integer, parameter :: UNT = 63347
    open(unit=UNT, file='delme.unf', access='DIRECT', &
        form='UNFORMATTED', status='REPLACE', recl=24)
    write(UNT, rec=1) 1, 2, 3
    write(UNT, rec=2) 4, 5, 6
    close(UNT)
end program direct_access
我正在将3个整数(每个4字节)写入一个记录长度为24字节的无格式文件。(注意:我在这里假设记录长度是以字节为单位的,显然这是不能保证的,并且依赖于编译器和系统。)

还有,从

未格式化的直接加法文件比格式化的直接存取文件更小更快,但它们不能在不同类型的处理器之间移植

(除非在打开文件时指定了
FORM='FORMATTED'
,否则该文件将不格式化。)

测试数据是否正确写入:

$ hexdump delme.unf
0000000 0001 0000 0002 0000 0003 0000 0000 0000
0000010 0000 0000 0000 0000 0004 0000 0005 0000
0000020 0006 0000 0000 0000 0000 0000 0000 0000
0000030
看起来不错。请注意,记录长度(24字节)大于数据(3*4字节),因此内部存在未使用的数据块

现在谈谈C程序,而不是我的专业知识:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

int main(){
    int record_size=24;
    int num_records=fsize("delme.unf") / record_size;
    FILE* binfile = fopen("delme.unf","rb") ;
    int* record = (int*) malloc (record_size) ;
    size_t result ;
    for (unsigned j=0; j < num_records; j++) {
        fseek(binfile, j * record_size, SEEK_SET) ;
        printf("%i : ", j) ;
        result=fread(record,sizeof(int),record_size/sizeof(int),binfile) ;
        for (unsigned i = 0; i<result; i++){
            printf("%i ",record[i]) ;
        }
        printf("\n");
    }
    free(record);
    fclose(binfile);
}
也很好

我注意到了几件事:

  • 您的缓冲区类型为
    char
    ——意味着每个元素只有一个字节。但是整数有4个字节。这意味着文件内容被分成几个元素
  • 此外,您的fortran代码将记录长度设置为24(我假设为字节),但3个整数每个只使用4个字节,因此不使用记录的一半。这就是为什么read会多出三个零
  • 如果有
    result
    元素,则
    buffer
    的索引需要从
    0
    变为
    result-1
  • 确定文件大小的方式显然不是一个好主意,请参阅
  • 您正在使用
    %f
    作为输出,表示浮动?但我以为这些是INT
当然,如果您不关心无序读取数据,可以在文件上循环:

#include <stdlib.h>
#include <stdio.h>

int main() {
    FILE* data = fopen("delme.unf", "rb") ;
    int var ;
    while (! feof(data )) {
        fread(&var, sizeof(int), 1, data);
        printf("%i ", var);
    }
    printf("\n");
    fclose(data);
}
#包括
#包括
int main(){
FILE*data=fopen(“delme.unf”、“rb”);
int-var;
而(!feof(数据)){
fread(&var,sizeof(int),1,数据);
printf(“%i”,var);
}
printf(“\n”);
fclose(数据);
}

当然有人会帮助你编写比我更好的C代码。

我的C语言不是很好,但我已经尝试了一些方法

首先是Fortran部分:

program direct_access
    implicit none
    integer, parameter :: UNT = 63347
    open(unit=UNT, file='delme.unf', access='DIRECT', &
        form='UNFORMATTED', status='REPLACE', recl=24)
    write(UNT, rec=1) 1, 2, 3
    write(UNT, rec=2) 4, 5, 6
    close(UNT)
end program direct_access
我正在将3个整数(每个4字节)写入一个记录长度为24字节的无格式文件。(注意:我在这里假设记录长度是以字节为单位的,显然这是不能保证的,并且依赖于编译器和系统。)

还有,从

未格式化的直接加法文件比格式化的直接存取文件更小更快,但它们不能在不同类型的处理器之间移植

(除非在打开文件时指定了
FORM='FORMATTED'
,否则该文件将不格式化。)

测试数据是否正确写入:

$ hexdump delme.unf
0000000 0001 0000 0002 0000 0003 0000 0000 0000
0000010 0000 0000 0000 0000 0004 0000 0005 0000
0000020 0006 0000 0000 0000 0000 0000 0000 0000
0000030
看起来不错。请注意,记录长度(24字节)大于数据(3*4字节),因此内部存在未使用的数据块

现在谈谈C程序,而不是我的专业知识:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

off_t fsize(const char *filename) {
    struct stat st; 

    if (stat(filename, &st) == 0)
        return st.st_size;

    return -1; 
}

int main(){
    int record_size=24;
    int num_records=fsize("delme.unf") / record_size;
    FILE* binfile = fopen("delme.unf","rb") ;
    int* record = (int*) malloc (record_size) ;
    size_t result ;
    for (unsigned j=0; j < num_records; j++) {
        fseek(binfile, j * record_size, SEEK_SET) ;
        printf("%i : ", j) ;
        result=fread(record,sizeof(int),record_size/sizeof(int),binfile) ;
        for (unsigned i = 0; i<result; i++){
            printf("%i ",record[i]) ;
        }
        printf("\n");
    }
    free(record);
    fclose(binfile);
}
也很好

我注意到了几件事:

  • 您的缓冲区类型为
    char
    ——意味着每个元素只有一个字节。但是整数有4个字节。这意味着文件内容被分成几个元素
  • 此外,您的fortran代码将记录长度设置为24(我假设为字节),但3个整数每个只使用4个字节,因此不使用记录的一半。这就是为什么read会多出三个零
  • 如果有
    result
    元素,则
    buffer
    的索引需要从
    0
    变为
    result-1
  • 确定文件大小的方式显然不是一个好主意,请参阅
  • 您正在使用
    %f
    作为输出,表示浮动?但我以为这些是INT
当然,如果您不关心无序读取数据,可以在文件上循环:

#include <stdlib.h>
#include <stdio.h>

int main() {
    FILE* data = fopen("delme.unf", "rb") ;
    int var ;
    while (! feof(data )) {
        fread(&var, sizeof(int), 1, data);
        printf("%i ", var);
    }
    printf("\n");
    fclose(data);
}
#包括
#包括
int main(){
FILE*data=fopen(“delme.unf”、“rb”);
int-var;
而(!feof(数据)){
fread(&var,sizeof(int),1,数据);
printf(“%i”,var);
}
printf(“\n”);
fclose(数据);
}

当然有人会帮助你编写比我更好的C代码。

编辑请将此作为一个新的答案

你的问题就在这一部分

for (unsigned i = 0; i<=result; i++){
   printf("%f\n",buffer[i]) ;
}
编辑下面的答案与您的问题无关

Fortran在无格式模式下的写入例程会自动向主数据添加页眉/页脚。页眉/页脚是包含数据大小的二进制字符串。页眉/页脚的长度由编译器确定

这是一些fortran程序的二进制输出

$xdd fort.20
00000000: 4000 0000 6664 6532 6265 616d 2020 2020  @...fde2beam    
00000010: 2020 2020 2020 2020 0432 0c00 7e03 0000          .2..~...
00000020: 7e03 0000 f059 34e7 a9d5 853f 8534 5ad5  ~....Y4....?.4Z.
00000030: 0910 1340 f059 34e7 a9d5 853f 8534 5ad5  ...@.Y4....?.4Z.
00000040: 0910 1340 4000 0000
在上面的示例中,40000000是页眉/页脚。因为40000000是64,所以页眉和页脚之间必须有64个字节。现在在显示的十六进制文本中,您可以看到页脚和页眉之间有32*4个十六进制。由于2hex=1byte,实际上页脚/页眉之间有64个字节


因此,当您让C程序读取fortran未格式化二进制文件时,您的程序需要跳过或明智地使用这些页眉/页脚。

编辑请将此作为新的答案

你的p