Gnuplot多次绘图未清数据及Perl文件写入异常咨询
问题:Gnuplot重复使用数据文件时出现追加而非覆盖的问题
我正在用Perl写一个程序,通过生成Gnuplot命令字符串并调用Gnuplot,多次处理不同数据集来绘图和拟合。为了避免磁盘冗余,每次都重用同一个数据文件名。
试过在两次调用间隙执行del puts.cmnds来清理内容,但Gnuplot还是会把新数据追加到旧数据里。而且因为文件还被Gnuplot进程占用,我没法在两次调用之间删除文件。
Perl中定义的Gnuplot命令字符串
$commandString= "val(x) = a + b*x + c*x*x fit val(x) 'puts.data' using 1:2 via a,b,c set title 'Puts' plot 'puts.data' with linespoints, a + b*x + c*x*x pause -1 set print 'putabc.txt' print a,b,c clear"; # End of multiline quote
写入Gnuplot命令文件的Perl代码
$cmndFileName="put.cmnds"; open $pfc,">$gpFolder$cmndFileName" or die "$!"; print $pfc $commandString; close $pfc;
注:我用的是覆盖模式(>)而非追加模式打开文件,但数据文件还是出现了追加的情况。
执行Gnuplot命令的Perl代码
$ret2 = `cd \\progra~1\\gnuplot\\bin\\ && gnuplot -e "" put.cmnds`;
后续清理代码
close $pfd; $dummy = `del $putFile`;
核心疑问
- 怎么让Gnuplot清除文件内容?
- 为什么我的Perl打开命令用了覆盖模式,却看起来像是在追加?
解决方案
先让Gnuplot完全退出再操作文件
问题根源是pause -1会让Gnuplot进程一直挂着等待用户输入,这时候文件被进程锁定,Perl没法删除或覆盖。要么删掉pause -1,要么改成自动超时关闭(比如pause 3),等Gnuplot进程彻底退出后,Perl才能正常处理文件。在Gnuplot内部清空数据文件
如果必须保留交互暂停,可以在Gnuplot命令的最开头添加清空数据文件的指令:set print 'puts.data' print "" set print这段代码会让Gnuplot先清空
puts.data的内容,再进行后续的拟合和绘图操作。检查Perl的文件路径是否正确
有可能你拼接的$gpFolder$cmndFileName路径有问题,导致每次操作的是不同的文件而非覆盖旧文件。可以在open前打印完整路径确认:print "命令文件完整路径:$gpFolder$cmndFileName\n";用Perl内置函数删除文件更可靠
别用系统del命令,改用Perl的unlink函数,它能直接返回删除结果和错误信息:if (unlink $putFile) { print "文件删除成功\n"; } else { warn "无法删除$putFile:$!"; }当然,前提还是Gnuplot进程已经释放了文件锁。
内容的提问来源于stack exchange,提问作者user1067305
相关产品推荐
相关产品推荐

