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

我读到这可能是操作系统的 EOL 字符的问题,我之前遇到过它,但不记得我是如何修复它的。我在 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 在同一台机器上编译,是否相同?

Edit3) 好的,似乎该文件被写入我的“/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

(包括空格)

任何人都知道使这项工作的方法吗?我认为这是问题的根源。

Edit4)找到解决方案:

我将读取行更改为

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

在哪里

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

它有效。谢谢大家,我希望这可以帮助其他人在未来节省很多时间。

4

2 回答 2

1

如果事实证明行尾问题是您的问题,那么您应该使用名为

println

在您的 Java 代码中,您写出的文件将具有适合您操作系统的行尾。使用这种方式生成的文件可能比使用"\n".

不过,我不确定这是行尾问题。

您看到的“菱形”字符很可能是替换字符,只要您在查看器中假设错误的字符编码就会出现。例如,如果您有一个由写出 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。

于 2013-06-11T06:46:11.547 回答
0

我将读取行更改为:

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

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

在哪里

CHARACTER(*), PARAMETER :: fileplace = 
 &"/Users/Tricknology/Desktop/Programming/FORTRAN/"
于 2013-06-12T10:58:26.933 回答