2017-05-09 22 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(),你会得到相同的行为,因为当你退出函数时文件被破坏。

相关问题