用line_as_stream 简化流的读取

ZDNet软件频道 时间:2003-05-13 作者:翻译:Java研究组织-郭晓刚 |  我要评论()
本文关键词:cpptips
在将数据持久化到文件时,你可能会发现很难强制要求系统将特定的部分数据写到一行中。将特定的数据写到同一行有时是很有用的,比如在你从流(如一个文件)中读取一个数组的时候。
本文译自Builder.com,未经许可请勿转载在将数据持久化到文件时,你可能会发现很难强制要求系统将特定的部分数据写到一行中。将特定的数据写到同一行有时是很有用的,比如在你从流(如一个文件)中读取一个数组的时候。

假设你要读取一个数组的元素,其中有一行被破坏了(比如丢失了一些数据)。一般情况下,这会导致后面所有的元素都受损。

作为一个例子,假设我们有一个数据结构,是一个窗口数组,你希望把它持久化到一个文件中,象下面这样:

  • 第一行:窗口的数量
  • 后面的每一行都包含两个值:窗口的宽度和窗口的高度

写成代码似乎很简单:

#include <iostream>
#include <vector>
#include <fstream>

struct Window
{
    Window( int nLength = 0, int nHeight = 0)
        : m_nWindowLength( nLength), m_nWindowHeight( nHeight)
    {}
    int m_nWindowLength;
    int m_nWindowHeight;
};

std::ostream & operator << ( std::ostream & streamOut, const Window & value)
{
    streamOut << value.m_nWindowLength << " " << value.m_nWindowHeight;
    return streamOut;
}
std::istream & operator >> ( std::istream & streamIn, Window & value)
{
    streamIn >> value.m_nWindowLength >> value.m_nWindowHeight;
    return streamIn;
}

void write_windows( std::vector< Window> &aWindows, const char * strFileName)
{
    std::ofstream streamOut( strFileName);
    // 第一行
    streamOut << aWindows.size() << std::endl;
    // 其余行
    std::vector< Window>::iterator itFirst = aWindows.begin(), itLast = aWindows.end();
    while ( itFirst != itLast)
    {
        // 每个窗口的数据都在它自己那一行
        streamOut << *itFirst << std::endl;
        ++itFirst;
    }
}


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134