我试图在文件中编写X对象,以后再读它,但我对c ++中的I / O了解不多。 X将是一个带有字符串和数字的类,仅作为示例。 (我用了一个字符串,但不应该只给我一封信)
#include <iostream>
#include <string>
#include <sstream>
class X {
int _number;
std::string _letter;
public:
X() { _number = 0; _letter = "anonimo"; }
X(int number, std::string letter) { _number = number; _letter = letter; }
int getnumber() { return _number; }
std::string getletter() { return _letter; }
void setNumber(int number) { _number = number; }
void setLetter(std::string letter) { _letter = letter; }
};
std::istream& operator>>(std::istream& is, X &x) {
std::string str;
std::string letter;
int number;
std::getline(is, str);
sscanf(str.c_str(), "%[^,], %d", letter, &number);A
X c(number, letter);
return is;
}
std::ostream& operator<<(std::ostream& out, X &x) {
out << x.getLetter() << ", " << x.getNum();
return out;
}
int main(int argc,char *argv[]) {
X c1 = X(2, "w");
X c2 = X(6, "c");
X c3, c4;
std::ofstream outFile;
if (!(argc > 1)) return -1;
outFile.open(argv[1]);
std::stringstream str;
str << c1 << std::endl << c2 << std::endl;
std::string xs = xs.c_str();
outFile << xs.c_str();
outFile.close()
std::ifstream infile;
infile.open(argv[1]);
infile >> c3;
infile >> c4;
return 0;
}
我知道我做错了,我想知道最好的方法,使用std :: stringstream将其保存在文件中,并使用来自c1的信息创建2个新的X,c3和c4和c2。
答案 0 :(得分:2)
您所描述的问题是序列化。来自C++ FAQ:
它[序列化]允许你取一个对象或一组对象 它们在磁盘上或通过有线或无线传输发送 机制,然后,也许在另一台计算机上,反转 过程:恢复原始对象。基本机制是 将对象展平为一维的比特流并转向 比特流返回原始对象。
同样来自C ++常见问题解答,您的具体情况似乎与[36.7] How do I serialize objects that aren't part of an inheritance hierarchy and that don't contain pointers to other objects?
相符关于序列化,有很多关于SO的问题。有关该主题的广泛讨论,请参阅How do you serialize an object in C++?
最后,如果您选择使用文本格式进行序列化,则可以考虑将该文本格式化为 JSON 或 XML 。有关JSON序列化,请参阅Converting C++ class to JSON。对于XML序列化,请参阅Minimal XML library for C++?,what's the easiest way to generate xml in c++?和第三方工具,例如CodeSynthesis XSD。
答案 1 :(得分:1)
我建议使用boost :: serialization
http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html
这些帮助文档中的讨论还涵盖了在文件中保存对象的许多注意事项。