我需要多次执行FORTRAN程序,这需要用户每次插入4个数值。 我找到了一个使用Python脚本自动生成的解决方案...这个脚本基本上在每次迭代时创建一个包含以下行的.sh文件(a.out是我必须自动执行的FORTRAN程序的名称)
./a.out<<EOF
param01
param02
param03
param04
EOF
使其可执行,并执行它。
所以,我试图在C ++中做同样的事情......我写了像
这样的东西int main()
{
long double mass[3] = {1.e+10,3.16e+10,1.0e+11};
double tau[3] = {0.5,0.424,0.4};
double nu[3] = {03.0,4.682,10.0};
long double Reff[3] = {1.0e+3,1.481e+3,3.0e+3};
int temp=0;
for (int i=0; i<3; i++)
{
ofstream outfile("shcommand.sh");
outfile << "./a.out<<EOF" << endl << mass[i] << endl << nu[i] << endl << Reff[i] << endl << tau[i] << endl << "EOF" << endl;
temp=system("chmod +x shcommand.sh");
temp=system("./shcommand.sh");
}
return 0;
}
但是当我运行我的C ++程序时,我收到以下错误消息
sh: 1: ./shcommand.sh: Text file busy
sh: 1: ./shcommand.sh: Text file busy
sh: 1: ./shcommand.sh: Text file busy
是否与C ++程序有关,试图在上一次迭代完成之前修改.sh文件? 我在网上看了一下,我似乎理解了命令完成后只返回system()命令...
答案 0 :(得分:3)
您正在尝试运行一个打开的文件,这不是一个好主意。在chmod
ding /运行它之前关闭它:
for (int i=0; i<3; i++)
{
{
ofstream outfile("shcommand.sh");
outfile << "./a.out<<EOF" << endl << mass[i] << endl << nu[i] << endl << Reff[i] << endl << tau[i] << endl << "EOF" << endl;
// the file is closed when outfile goes out of scope
}
temp=system("chmod +x shcommand.sh");
temp=system("./shcommand.sh");
}
顺便说一下,通过直接写入程序的标准输入(例如popen
)可以避免所有这些shell混乱:
for (int i=0; i<3; ++i) {
FILE *fd = popen("./a.out", "w");
assert(fd!=NULL); // do proper error handling...
fprintf(fd, "%Lf\n%f\n%Lf\n%f\n", mass[i], nu[i], Reff[i], tau[i]);
fclose(fd);
}
答案 1 :(得分:2)
似乎因为shell无法读取脚本,因为它仍然由您的程序打开。
在致电outfile.close();
之前尝试添加system()
。