C ++:以最简单,最干净的方式将值写入文件?

时间:2015-08-23 16:46:39

标签: c++ file struct

我正在开发一个C ++初学者级别的项目(不是绝对的初学者,比如"什么'循环"但我也不会说它的中级水平)

在这个项目中,我需要在结构变量中将一些存储在内存中的数据保存到文件中(这是简单的命令式编程,不涉及OOP)。

我已经阅读了一些关于序列化,使用一些非标准库等选项的内容。但我需要保持尽可能简单和干净。

到目前为止,我有2个结构,非常类似于:

struct client {
    string name;
    string address;
    double phone;
};
struct invoice {
    string client_name;
    double total;
};

我正在寻找http://www.cplusplus.com/doc/tutorial/files提供的类似示例:

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

int main () {
  ofstream myfile;
  myfile.open ("example.txt");
  myfile << "Writing this to a file.\n";
  myfile.close();
  return 0;
}

有没有办法做类似的事情,但是要将结构变量写入(然后能够读取)文件,保持简单? 几年前,我记得在将文件写入文件时,在Pascal中以一种非常简单的方式处理这个问题。它类似于:打开文件,写入记录字段1,写入字段分隔符,写入记录字段2,写入字段分隔符,写入记录分隔符。然后在阅读时我会搜索分隔符。这不是在C ++中推荐的吗?

感谢。

3 个答案:

答案 0 :(得分:2)

您可以检查C ++的序列化,例如。 Boost库中的Boost :: serialization。

Is it possible to serialize and deserialize a class in C++?

答案 1 :(得分:1)

您必须将2个函数关联到此类:inputStruct和OutputStruct。输入应该能够读取输出生成的内容。简单的方法是以与实现它们相同的顺序编写每个struct元素。

答案 2 :(得分:1)

明确的方法是为要写入文件的每个结构或类实现序列化和反序列化函数。您为serialize函数提供输出流的引用,并写入您要写入的每个字段。反序列化反过来:它以相同的顺序读取所有属性,并在当前类或结构中设置它们。如果使用流运算符进行序列化,则输出文件将是文本文件。

使用c ++,您可以重载流操作符,因此它在您的代码中看起来很漂亮,但在其他语言中,您必须使用函数。

您也可以使用二进制序列化,但问题更多,因为您需要检查当前使用的平台的字节顺序。如果您只是在一个平台上使用它,您可以尝试写入和读取功能。他们需要变量的指针和大小,然后将它们复制到文件中或从文件中复制它们。单独使用这些属性,不要复制整个结构,因为它可能容易导致错误。

<强>更新

我进行了序列化和反序列化功能。我还没有对它们进行测试,所以我不能100%确定它们能够正常工作。

静态功能:

void serialize_client( ofstream& out, client& cl )
{
    out << cl.name << endl;
    out << cl.address << endl;
    out << cl.phone << endl;
}

void deserialize_client( ifstream& in, client& cl )
{
    getline( in, cl.name );
    getline( in, cl.address );
    in >> cl.phone;    
}

用法:

client client_instance;
deserialize_client( cin, client_instance );   
serialize_client( cout,  client_instance );

操作员过载:

ostream& operator<<( ostream& os, const client& cl )
{
    os << cl.name << endl;
    os << cl.address << endl;
    os << cl.phone << endl;
    return os;
}

istream& operator>>( istream& is, client& cl )
{
    getlise( is, cl.name );
    getlise( is, cl.address );
    is >> cl.phone; 
    return is;
}

client client_instance;
cin >> client_instance;   
cout << client_instance;