【问题标题】:Writing/reading objects from a file从文件写入/读取对象
【发布时间】:2013-11-20 09:03:39
【问题描述】:

我试图在文件中写入 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。

【问题讨论】:

    标签: c++ file object file-io io


    【解决方案1】:

    您描述的问题是序列化。来自C++ FAQ

    它 [序列化] 让您可以获取一个对象或一组对象,将 它们在磁盘上或通过有线或无线传输方式发送 机制,然后稍后,也许在另一台计算机上,反转 过程:复活原始对象。基本机制是 将对象扁平化为一维比特流,并将 该比特流返回到原始对象中。

    同样来自 C++ FAQ,您的具体情况似乎符合:[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++?

    最后,如果您选择使用 文本格式 进行序列化,您可以考虑将该文本格式化为 JSONXML。对于 JSON 序列化,请参阅Converting C++ class to JSON。对于 XML 序列化,请参阅Minimal XML library for C++?what's the easiest way to generate xml in c++? 和第三方工具,例如 CodeSynthesis XSD

    【讨论】:

      【解决方案2】:

      我建议使用 boost::serialization

      http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html

      这些帮助文档中的讨论还涵盖了有关将对象保存在文件中的许多注意事项。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2017-08-13
        相关资源
        最近更新 更多