2017-05-09 70 views
0

我要輸出相當多的變量爲ASCII文件,這裏是我怎麼做,現在一個例子:輸出幾個變量到ASCII文件在一個循環中

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() 
{ 
    fstream file; 
    file.open("output.txt", ios_base::out); 

    int a = 1; 
    int b = 3; 
    int c = 3453; 
    double d = 5.3; 
    string e = "a"; 
    double f = 231.09; 


    file << "\"a\":" << a << endl; 
    file << "\"b\":" << b << endl; 
    file << "\"c\":" << c << endl; 
    file << "\"d\":" << d << endl; 
    file << "\"e\":" << e << endl; 
    file << "\"f\":" << f << endl; 

    file.close(); 

    return 0; 
} 

輸出的格式在ASCII文件中如上所示:變量的名稱後跟其值。

問題:有沒有一種方法來自動化這個過程,比如說,在一個循環中,所以我不必手動輸入它並混亂我的文件?我希望這樣的解決方案要求:

  1. 製作一個包含所有變量名稱的列表:{a, b, c, d, e, f}
  2. 通過這個列表,併爲每個元素i運行一個循環後字符串file << ToString[element i] << element i << endl;

我我很樂意得到關於如何專業進行這項工作的暗示。這甚至可以用C++嗎?

+0

即使您不知道它們的值,您是否知道要輸出的變量的類型,數量和順序?換句話說,你能否定義一個實際的'struct'?如果您可以提前定義數據結構,則可以爲其創建一個基本的序列化函數,以創建要寫入文件的字符串。如果你不能提前定義它,你將不得不跳過更多的箍環(我會研究'std :: map'東西)。實際上任何事情都可以在C++中完成,你可能必須自己完成大部分工作;)。 – Treebasher

+0

因爲你的變量是不同類型的,所以如果你想把它們放在一個列表(向量)中,你首先需要將它們封裝到一個結構體或一個有區別的聯合體中(或者我從未使用過的C++ 17中的std :: variant )。該程序不知道你的變量名稱,永遠不會,所以你的結構將需要保存變量的名稱 – AlexG

回答

3

您可以使用字符串化運算符定義自動化印刷工藝:

#define FORMAT(x) "\""#x"\": " << x 
#include <iostream> 
using namespace std; 

int main() { 
    int i=666; 
    cout << FORMAT(i) << endl; 
} 

這將產生:

"i": 666 

但你不能做的變量列表,並遍歷它至少沒有一些骯髒的元編程。

0

有沒有「專業」的方式來寫文件。在你的情況下,如果你的變量是明確聲明的,那麼可以逐一寫入它們。

如果你有一個容器(如性病::向量或std ::列表),你可以遍歷它們並把它們寫,如:

for(auto e : myVector) [ 
    file << e << "\n"; 
} 

如果你想在某些情況下,「效率」,如果你正在編寫GB數據,最好是用大塊寫入(儘管我相信大多數fs甚至是C++中的文件流都可以進行這種優化)。

所以不是做上述循環do:

file.write(myVector, myVector.size()) 

這裏的一個問題是,你的變量是明顯不同的類型。在這種情況下,如果你想使用的方法與容器你必須先將他們轉換爲同樣類型...例如:

myVecotr.push_back(std::to_string(yourVariable)) 

或者你可以使用類型爲std向量::任何和忽略轉換(雖然我不確定調用.write會在這種情況下工作,而std :: any也可能有一點點的開銷)。

小記:fstream有一個釋放文件的析構函數。所以只要您靜態分配,就不需要調用close()。所以在你的情況下,如果你刪除file.close(),你會得到相同的行爲,因爲當你退出函數時文件被破壞。

相關問題