我必须输出相当多的变量到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文件中输出的格式如上所示:变量的名称后跟其值。
问题:有没有办法让自动化这个过程,比如说,在一个循环中,所以我不必手动输入它并弄乱我的文件?我希望这样的解决方案需要:
{a, b, c, d, e, f}
i
创建字符串file << ToString[element i] << element i << endl;
我很乐意提示如何专业地完成这项任务。这对C ++来说是否可能?
答案 0 :(得分:3)
您可以在定义中使用stringify运算符来自动化打印过程:
#define FORMAT(x) "\""#x"\": " << x
#include <iostream>
using namespace std;
int main() {
int i=666;
cout << FORMAT(i) << endl;
}
将产生:
"i": 666
但是你不能制作一个变量列表并至少在没有一些脏元编程的情况下迭代它。
答案 1 :(得分:0)
没有&#34;专业&#34;写文件的方法。在您的情况下,如果您的变量被明确声明,则可以逐个编写它们。
如果你有一个容器(例如std :: vector或std :: list),你可以迭代它们并编写它们,例如:
for(auto e : myVector) [
file << e << "\n";
}
如果你想要&#34;效率&#34;在某些情况下,如果您正在编写GB数据,那么以较大的块编写可能会更好(尽管我相信大多数fs甚至C ++中的文件流都可以进行优化)。
所以不要做上面的循环:
file.write(myVector, myVector.size())
这里的一个问题是你的变量显然是不同的类型。在这种情况下,如果您希望使用容器的方法,您必须先将它们转换为类似的类型......例如:
myVecotr.push_back(std::to_string(yourVariable))
或者你可以使用类型为std :: any的向量并忽略转换(虽然我不确定在这种情况下调用.write会起作用,而且std :: any也可能有一点点开销)
小注意:fstream有一个析构函数来释放文件。因此,只要您静态分配它,就不需要调用close()。因此,在您的情况下,如果删除file.close(),则会因为退出函数时文件被销毁而获得相同的行为。