首页 文章

FORTRAN遇到过早的EOL

提问于
浏览
0

~~求助,见编辑4)

我在OSX上用Java创建一个输入文件,当我尝试运行读取输入文件的FORTRAN程序时,我在第一行遇到EOF:

At line 37 of file ../fortran.f (unit = 5, file = 'input2.txt')
Fortran runtime error: End of file

第37行开始的地方:

open (5,file='input2.txt')
  read(5,*) INDEX

我读到这可能是OS _1668441已经遇到它的问题,但是不记得我是如何修复它的 . 我在Java代码中使用"\n" .
我也尝试从FORTRAN代码编写一个简单的文件,在TextWrangler中我打开它并看到一些主角(菱形)所以我将其复制到我的Java代码但无济于事 .

此外,如果我在Eclipse中编辑文本并使用FORTRAN程序运行它,它就可以工作 .
请帮助,提前致谢

Edit1)这是input2.txt的Hexdump,我没有看到任何奇怪的东西,但是我的眼睛没有受过训练 .

00000000  31 0a 32 0a 4e 69 74 72  6f 67 65 6e 0a 30 2e 30  |1.2.Nitrogen.0.0|
00000010  09 30 2e 30 09 30 2e 30  09 30 2e 30 09 30 2e 30  |.0.0.0.0.0.0.0.0|
*
00000030  09 0a 48 79 64 72 6f 67  65 6e 0a 30 2e 30 09 30  |..Hydrogen.0.0.0|
00000040  2e 30 09 30 2e 30 09 30  2e 30 09 30 2e 30 09 30  |.0.0.0.0.0.0.0.0|
00000050  2e 30 09 30 2e 30 09 30  2e 30 09 30 2e 30 0a 30  |.0.0.0.0.0.0.0.0|
00000060  20 35 39 34 2e 30 20 20  31 2e 30 0a 30 2e 35 20  | 594.0  1.0.0.5 |
00000070  30 2e 35 20 0a 30 0a 0a                           |0.5 .0..|
00000078

那些零现在还可以,java代码中的小错误但是FORTRAN仍然应该在计算中给我NaN .

Edit2)测试文件中的十六进制转储:

00000000  20 62 6c 61 68 0a 20 62  6c 61 68 0a 20 62 6c 61  | blah. blah. bla|
00000010  68 0a 0a                                          |h..|
00000013

我之前遇到过这个问题,一个人通过显式设置EOL到^ M(而不是Unix的^ J)成功测试了文件,但是,我不知道如何用java做这个,不应该EOL约定是如果program.f是在同一台机器上编译的呢?

编辑3)好的,似乎文件被写入我的“/ Users / Tricknology /”目录而不是我运行程序的位置 . 但是,这导致了一个问题 .

file='/Users/Tricknology/Desktop/Programming/FORTRAN/input2.txt'

太长了,而且

file='/Users/Tricknology/Desktop/Programming'
 &/FORTRAN/input2.txt'

生产环境 :

At line 32 of file ../fortran.f (unit = 4, file = '')
Fortran runtime error: File '/Users/Tricknology/Desktop/Programming                       /Thermo/OUTPUT2' does not exist

(包括空格)

有人知道如何使这项工作?我认为这是问题的根源 .

编辑4)找到解决方案:

我将读取行更改为

open (4,file=fileplace//"OUTPUT2", action='write')

哪里

CHARACTER(*), PARAMETER :: fileplace = 
 &"/Users/Tricknology/Desktop/Programming/FORTRAN/"

它的工作原理 . 谢谢大家,我希望这有助于其他人在将来节省大量时间 .

2 回答

  • 0

    如果事实证明行结束问题是你的问题,那么你应该使用命名的方法

    println
    

    在您的Java代码中,您编写的文件将为您的操作系统提供正确的行结尾 . 对于使用这种方式生成的文件,使用 "\n" 可能会更好 .

    不过,我不确定这是一个行结束问题 .

    您看到的"diamond-shaped"字符非常可能REPLACEMENT CHARACTERS,只要您在查看器中假设错误的字符编码就会显示 . 例如,如果您有一个由写出UTF-8的程序创建的文件,并且您在编辑器中打开它,该编辑器假定编码为Windows-1252或Latin-1或MacRoman,那么您将看到替换字符 . 还有其他情况下会弹出这些东西 .

    确保您的Java程序,Fortran程序和操作系统的默认编码,以及您在TextWrangler中假设的编码都是相同的,最好是UTF-8 .

    另外,使用二进制编辑器查看文件input2.txt,或者只需输入

    hexdump -C input2.txt
    

    在你的命令行上(我猜你有一台Mac,因为你提到了TextWrangler) . 也许前几个字节代表文件的结尾,或者你的Fortran编译器无法理解你的BOM .

    TL; DR:查看txt文件的二进制编码,检查BOM或其他奇怪现象 . 无论您发现什么,都可以在您的世界中制作UTF-8 .

  • 1

    我将读取行更改为:

    open (4,file=fileplace//"OUTPUT2", action='write')
    
    open (5,file=fileplace//"input2.txt", action='read')
    

    哪里

    CHARACTER(*), PARAMETER :: fileplace = 
     &"/Users/Tricknology/Desktop/Programming/FORTRAN/"
    

相关问题