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
Io 如何使用Fortran从*.obj文件读取人脸信息 问题_Io_Fortran_Special Characters_Gfortran_Cad - Fatal编程技术网

Io 如何使用Fortran从*.obj文件读取人脸信息 问题

Io 如何使用Fortran从*.obj文件读取人脸信息 问题,io,fortran,special-characters,gfortran,cad,Io,Fortran,Special Characters,Gfortran,Cad,现代Fortran如何在条目之间使用双斜杠(如*.obj格式)导航文件?目标是提取顶点索引(第一个条目)并忽略顶点法线索引(第二个条目) 例子 例如,对于这个片段 f 297//763 298//763 296//763 f 296//764 298//764 295//764 f 384//765 385//765 382//765 f 384//766 382//766 383//766 目标是创建如下数组: face ( 1 ) = [297, 298, 296] face ( 2 )

现代Fortran如何在条目之间使用双斜杠(如*.obj格式)导航文件?目标是提取顶点索引(第一个条目)并忽略顶点法线索引(第二个条目)

例子 例如,对于这个片段

f 297//763 298//763 296//763
f 296//764 298//764 295//764
f 384//765 385//765 382//765
f 384//766 382//766 383//766
目标是创建如下数组:

face ( 1 ) = [297, 298, 296]
face ( 2 ) = [296, 298, 295]
face ( 3 ) = [384, 385, 382]
face ( 4 ) = [384, 382, 383]
如果答案采用更丰富的格式,如

f a//b//c  d//e//f g//h//i j//k//l
其他职位 [的答案指向一个已删除的博客。此帖子[不相关]

工具书类 *.obj格式的三个参考文件:

正如评论中所建议的,我们可以使用
sed
等将
/
替换为空格。我们还可以用Fortran(见下文)逐个扫描每个字符。然后,我们将所有整数读入
VAL
,并选择所需部分作为
VAL(1:6:2)
。类似的方法可通过将1:6:2更改为1:12:3等,用于
fa//b//cd//e//f…

[test.f90]
program main
    implicit none
    character(100) buf
    integer vals(10), ios, i

    open(10, file="test.dat", status="old")
    do
        read(10, "(a)", iostat=ios) buf
        if (ios /= 0) exit

        do i = 1, len(buf)
            if (buf(i:i) == "/") buf(i:i) = " "   !! replace "/" by " "
        enddo

        read(buf(2:), *) vals( 1:6 )  !! read all items
        print *, vals( 1:6:2 )  !! select items 1, 3, 5
    enddo
    close(10)
end

[test.dat]
f 297//763 298//763 296//763
f 296//764 298//764 295//764
f 384//765 385//765 382//765
f 384//766 382//766 383//766

$ gfortran test.f90 && ./a.out
     297         298         296
     296         298         295
     384         385         382
     384         382         383

为了好玩,这里有一个Python中的类似代码,由于
replace()
split()
的缘故,代码变得更短了。如果我们有一些类似的例程,我想上面的代码也会变得更短

dat = []
for line in open("test.dat").readlines():
    dat.append( line[1:] .replace("/", " ") .split() [::2] )

import numpy as np
face = np.array(dat, dtype=int)
print(face)

$ python test.py
[[297 298 296]
 [296 298 295]
 [384 385 382]
 [384 382 383]]

这看起来像是一个家庭作业问题。您尝试过什么?步骤1-使用
sed
(或其他类似工具)预处理文件,以将
/
替换为空格。步骤2-使用Fortran的列表定向输入功能读取一个包含一个字符和6个整数的行(v easy).Step 3-按您的意愿将数据插入
数组。@evets:不是家庭作业问题。任务是从CAD例程中获取*.obj文件,以提取曲面以输入到其他分析例程。@High Performance Mark:是,sed和awk(其他将起作用),但目标是交付一个Fortran可执行文件。请注意,任务是获取前导项,而不是所有项(3个整数与6个整数)。那么,您尝试了什么?使用
access=stream
打开文件允许您一次读取一个字符,这允许您编写解析器来执行任何您想要的操作。只需打开文件并使用
write(*,'(a)')读取即可
将读取整行。然后您可以使用
索引
扫描
/
,并在下一个字符处达到峰值,以查找
'/'
。相当简单的东西。我最初使用“merge”替换字符,但我将其更改为简单的“if”,因为在这种情况下更简单。。。