【发布时间】:2013-07-29 16:43:25
【问题描述】:
我正在将大量 f77 程序移植到一个新系统,编译 gfortran 而不是 g77。其中一些程序同时使用 Fortran 读取 语句,以及从标准输入读取的(自定义)C 例程。这 如果程序以交互方式运行,则工作正常,但如果 交互式输入作为一个单独的文件提供,该文件通过管道传送到 程序,或作为此处的文档。对于最后两种情况,如果 Fortran read 后跟一个 C getchar,getchar 返回 EOF 而不是 文件的未读部分。
将 Fortran 读取替换为调用 fget 可以解决以下问题 管道输入,但不适用于此处的文档。
所有这些都使用 sh shell,在 Mac OS X 10.8.4 上; gfortran 是 gcc 4.6.2 C 的 gcc 是 Apple 版本,4.2.1(我打算用 一致的 gcc 但目前不能)。
有人知道原因或解决方案吗?
这是一个创建和编译两个程序的脚本,并演示 问题:
#!/bin/sh
cat << XXX > tmp.f
character*1 sym,dum
call fget(sym)
write(6,*) sym
call tmpc
stop
end
XXX
cat << XXX > tmpc.c
#include <stdio.h>
#include <ctype.h>
float tmpc_()
{
int c;
c=getchar();
fprintf(stderr,"1. c is %o %d\n",c,c);
c=getchar();
fprintf(stderr,"2. c is %o %d\n",c,c);
c=getchar();
fprintf(stderr,"3. c is %o %d\n",c,c);
fprintf(stderr,"\n");
return(0);
}
XXX
gcc -c tmpc.c
gfortran tmp.f tmpc.o
cat << XXX > tmp
*
2.34 12
XXX
cat tmp | a.out
a.out << XXX
*
2.34 12
XXX
rm tmp.f a.out tmpc.c tmpc.o tmp
输出是(文件传输时的前四行,第二行 当它是一个here文档时设置):
*
1. c is 12 10
2. c is 62 50
3. c is 56 46
*
1. c is 37777777777 -1
2. c is 37777777777 -1
3. c is 37777777777 -1
第一组正确:c的值对应的字符 \n 2 。 他们应该这样做。
【问题讨论】:
-
当你尝试 a.out
-
这可能是 CR 与 LF 的问题。无论如何,“这里的文档”语法值得失眠吗?如果可行,只需使用 tmp 文件形式即可。
-
@cup
-
好的,明白了:当您从脚本输入时,它会失败,而当您从模拟控制台输入的管道输入时,它会起作用。这可能与缓冲和非缓冲输入有关,因为您使用的是两个独立的输入系统。在某些 C 编译器上,将 getc 与 scanf 混合也会产生类似的问题。