以行为单位的文件处理程序

原创 2005年03月01日 21:29:00

有些应用中,不一定必须要数据库支持,纪录可以保存在文本里,此时,
如何对这些记录进行增删改查的操作呢?这里以C++标准库提供了一个类,
来处理此类问题。该类以行为单位进行操作,设一条纪录存为一行。只要
拿到一行数据,再用string类进行其他处理也就不费事了。

头文件:
/*************************************************************
 * LineFile class Interface
 * 
 * [author] iori.ogami
 * [date]  2005-1-15
 * [ver]  1.3
 * [env]  Visual C++ 6.0 sp5
 * 
 **************************************************************/
#pragma warning(disable:4786)

#include <string>
#include <vector>
#include <fstream>

class LineFile
{
public:
 LineFile(){};
 LineFile(std::string fileName);
 LineFile(const LineFile& lf);
 LineFile& operator =(const LineFile& lf);
 virtual ~LineFile();

 
 long GetLineCount() const { return ln_cnt; }

 std::string GetLineText(long lnnum) const;

 void UpdateLine(long lnnum, std::string txt);

 void InsertLine(long lnnum, std::string txt);

 void DeleteLine(long lnnum);

 void AddLine(std::string txt);


 long GetLineByKeyWord(std::string keyWord) const;

 std::vector<long> GetLinesByKeyWord(std::string keyWord) const;

protected:
 std::fstream* pFile;
 std::vector<std::string> vec;
 std::string file_name;
 long ln_cnt;
 
private:
 bool Reset();
 void dump();
};

CPP文件:
/************************************
 implementation of LineFile class
*************************************/
#include "LineFile.h"
#include <iostream>
#include <ios>

#define MAX_CHAR 1024 // max chars in a line, define your own MAX_CHAR here

using namespace std;

/*
 * constructor
 */
LineFile::LineFile(std::string fileName): file_name(fileName),ln_cnt(0)

{
 pFile = new fstream( file_name.c_str(), ios_base::out|ios_base::app ); // create if not found
 pFile->close();
 pFile->open(file_name.c_str(), ios_base::in | ios_base::out); // reopen for read and write
 
 char s[MAX_CHAR] = {0};
 string ss;
 while( pFile->getline(s,MAX_CHAR) )
 {
  cout<<s<<endl;
  ss = s;
  vec.push_back(ss);
 }
 ln_cnt = vec.size();

 pFile->clear();
 pFile->seekg( ios_base::beg );
 cout<<"construct end. line number: "<<ln_cnt<<endl;
}


/*
 * copy constructor
 */
LineFile::LineFile(const LineFile& lf):
 file_name(lf.file_name),
 vec(lf.vec),
 ln_cnt(lf.ln_cnt)
{
  pFile = new fstream( lf.file_name.c_str(), ios_base::in | ios_base::out );
}


/*
 * the destructor
 */
LineFile::~LineFile()
{
 if(pFile)
 {
  if(pFile->is_open()) pFile->close();
  delete pFile;
 }
}


/*
 * move the stream poiter to the start position. if the stream status is 'fail', recover it.
 */
bool LineFile::Reset()
{
 if( pFile->bad() )
 {
  cout<<"[LineFile::Reset] bad stream"<<endl;
  return false;
 }
 if( pFile->fail() ) pFile->clear();
 pFile->seekg( ios_base::beg );
 return true;
}


/*
 * save the file text from vector to the file stream.
 */
void LineFile::dump()
{
 // reopen and trunk the file
 Reset();
 pFile->close();
 pFile->open(file_name.c_str(), ios_base::out | ios_base::trunc);

 ln_cnt = vec.size();
 for(long i=0; i<ln_cnt; i++)
 {
  string s = vec[i];
  *pFile<<s.c_str()<<endl;
 }
 pFile->close();
 pFile->open( file_name.c_str(), ios_base::in | ios_base::out );
}


/*
 * evaluate operator '='
 */
LineFile& LineFile::operator =(const LineFile& lf)
{
 file_name = lf.file_name;
 ln_cnt = lf.ln_cnt;
 if( !vec.empty() ) vec.clear();
 vec = lf.vec;

 if(pFile)
 {
  if(pFile->is_open()) pFile->close();
  delete pFile;
 }
 pFile = new fstream( lf.file_name.c_str(), ios_base::in | ios_base::out );

 return *this;
}

/******************************/
// the interfaces
/******************************/
/*
 * get a string by line number,note that the feedline character '/n' is not included.
 */
string LineFile::GetLineText(long lnnum) const
{
 if( lnnum >ln_cnt || lnnum<=0 )
 {
  cout<<"[LineFile::GetLineText] illegal line number: "<<lnnum<<endl;
  return "";
 }

 return vec[lnnum-1];
}


/*
 * insert a line at lnnum, and append a feedline character.
 */
void LineFile::InsertLine(long lnnum, std::string txt)
{
 if( lnnum >ln_cnt || lnnum<=0 )
 {
  cout<<"[LineFile::InsertLine] illegal line number: "<<lnnum<<endl;
  return;
 }
 
 vector<string>::iterator iter = vec.begin();
 for(long i=0; i<lnnum-1; i++,iter++);
 vec.insert(iter, txt);
 dump();
}


/*
 * update the specifized line with a new string, also append a feedline character.
 */
void LineFile::UpdateLine(long lnnum, std::string txt)
{
 if( lnnum >ln_cnt || lnnum<=0 )
 {
  cout<<"[LineFile::UpdateLine] illegal line number: "<<lnnum<<endl;
  return;
 }

 vec[lnnum-1] = txt;
 dump();
}


/*
 * delete a line
 */
void LineFile::DeleteLine(long lnnum)
{
 if( lnnum >ln_cnt || lnnum<=0 )
 {
  cout<<"[LineFile::DeleteLine] illegal line number: "<<lnnum<<endl;
  return;
 }

 vector<string>::iterator iter = vec.begin();
 for(int i=0; i<lnnum-1; i++,iter++);
 vec.erase(iter);
 dump();
}


/*
 * append a line at the end of the file.
 */
void LineFile::AddLine(std::string txt)
{
 vec.push_back(txt);
 dump();
}


/*
 * get the line number by a key word, return 0 if not found.
 */
long LineFile::GetLineByKeyWord(string keyWord) const
{
 for(long i=0; i<ln_cnt; i++)
 {
  if( vec.at(i).find(keyWord)!=-1 )
   return i+1;
 }
 return 0;
}


/*
 * get the line numbers by a key word.
 */
vector<long> LineFile::GetLinesByKeyWord(string keyWord) const
{
 vector<long> v;
 for(long i=0; i<ln_cnt; i++)
 {
  if( vec.at(i).find(keyWord)!=-1 )
   v.push_back(i+1);
 }
 return v;
}

java 以行为单位读取txt文件(1)

java txt文件读取
  • yxmaomao1991
  • yxmaomao1991
  • 2016年02月22日 19:40
  • 1155

在线沙盒(恶意软件行为分析工具)整理介绍

在进行未知文件分析时,有时我们需要实际运行它,并记录他的一切行为,进而对其进行分析。当然,我们可以用真机或者虚拟机,结合一些行为记录软件来进行测试,但在线沙盒有时会更加方便实用。下面就介绍几个我找到的...
  • u011762549
  • u011762549
  • 2014年04月04日 14:06
  • 5700

【工具类】JAVA 以行为单位读取文件并比对

package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader...
  • u010777931
  • u010777931
  • 2014年07月11日 10:48
  • 1147

用户行为分析业务系统日志处理方案

1、日志要进入的目标表结构信息 1.1 Hive库上的目标表结构信息 CREATE TABLE `yemao_log`( `id` int, `time` int, `ur...
  • nisjlvhudy
  • nisjlvhudy
  • 2015年12月04日 21:04
  • 2262

可执行文件从装载到运行的全过程描述

我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,(关于源代码到可执行文件的介绍见我的另一篇博客:程序从代码到可执行文件的过程简述)那么当我们在cmd窗口敲出指令$test argv1 arg...
  • Virtual_Func
  • Virtual_Func
  • 2015年09月21日 21:53
  • 922

通过一般处理程序实现【文件上传】

注意事项: 1>表单的提交方式必须为post,method="post";//由于http上面的数据大小有限,所以不支持使用get显示到上面。 2>必须修改表中提交数据时的数据组织方式 enctype...
  • shuai7boy
  • shuai7boy
  • 2016年11月17日 17:18
  • 402

微信小程序尺寸单位rpx和样式使用详解

转载请注明预见才能遇见的博客:http://my.csdn.net/ 原文地址: 微信小程序尺寸单位rpx和样式使用详解 1.尺寸单位 rpx(responsive pixel): 可以根据屏幕宽...
  • pcaxb
  • pcaxb
  • 2017年02月24日 15:00
  • 4356

5款免费在线软件行为分析(在线沙盘)

1.Anubis是一个提供可控环境来执行用户提交的二进制文件的动态恶意软件分析平台。该系统通过监视关键的Windows API和系统服务调用、跟踪网络数据流、记录网络通讯,实现对二进制文件的分析,并生...
  • super_mimi
  • super_mimi
  • 2014年12月05日 22:27
  • 2145

微信小程序尺寸单位

微信小程序尺寸单位 rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则75...
  • lamianT
  • lamianT
  • 2016年11月23日 12:02
  • 6341

自然语言处理(NLP)在企业应用中的实践(一)

在通用的领域,自然语言处理已经进入我们的生活,比如说谷歌有谷歌助手,微软有小娜,它们可以处理一些简单的指令。但是目前为止,还没有看到企业应用领域中广泛应用此项技术。如何将自然语言处理和复杂的企业应用结...
  • qq_35414313
  • qq_35414313
  • 2016年07月02日 18:46
  • 252
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:以行为单位的文件处理程序
举报原因:
原因补充:

(最多只允许输入30个字)