2013-12-14 55 views
2

我想使用一些printf打印到文件。如何打印到AMPL文件? `選項log_file`不起作用

我可以使用

for{i in set1} printf '%10.5f\n',var1[i] >> ('a' & 'very' & 'long' & 'string' & 123 & sprintf('%5d', foo)); 
for{i in set2} printf '%10.5f\n',var2[i] >> ('a' & 'very' & 'long' & 'string' & 123 & sprintf('%5d', foo)); 
for{i in set3} printf '%10.5f\n',var3[i] >> ('a' & 'very' & 'long' & 'string' & 123 & sprintf('%5d', foo)); 

但我不想每次都重複文件。

看起來option log_file應該做的伎倆,但不適用於我:文件被創建,但空的,並輸出打印在控制檯。

回答

1

我發現在打印後我必須更改option log_file,因爲AMPL似乎沒有關閉文件,即使我使用的是close

然後,以下工作:

print "Hello, ";    # Printed to the console 
option log_file "test.txt"; 
print "World";    # Printed to the console and file 
option log_file ""; 
close; 
+0

那麼,在我的機器上,它工作得很好,沒有'close;'。 – Ali

+0

@Ali我使用Windows XP和沒有'選項log_file「」;關閉;'生成的文件是空的,我不能重命名或刪除它,因爲它正在使用ampl.exe。你使用哪個操作系統? – Oriol

+0

啊,有趣。我在Linux上。但它可能不是操作系統。你可以嘗試在命令行中運行'ampl.exe your_model.mod'嗎?通過這種方式,在運行模型後,ampl.exe退出,並且日誌文件不再可以由ampl.exe使用。 – Ali

2

爲了避免重複的文件名,將其存儲在一個參數:

param out symbolic = 
    'a' & 'very' & 'long' & 'string' & 123 & sprintf('%5d', foo); 
for{i in set1} printf '%10.5f\n',var1[i] >> (out); 
for{i in set2} printf '%10.5f\n',var2[i] >> (out); 
for{i in set3} printf '%10.5f\n',var3[i] >> (out); 

注意周圍out括號是很重要的,因爲它們允許通過表達式(在這種情況下是參數引用)而不是逐字文本作爲文件名。

+0

謝謝,我試過類似的東西,但AMPL試圖將字符串轉換爲數字並拋出錯誤。 – Oriol