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

原创 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读取文件——以行为单位读取

  • 2013年07月14日 15:04
  • 765B
  • 下载

以行为单位读写文件

每次读取一行,可以用fgets( char*string,   intn,   FILE*stream);只要n大于字符最多行的字符数,每次都会读取整行。 每次写入一行,可以用int fputs(  ...
  • wutaozhao
  • wutaozhao
  • 2010-10-04 21:58:00
  • 701

【Java】运用多种方式读取文件内容,包括按字节、字符和按行为单位读取文件内容

主要功能:运用多种方式读取文件内容 * 包括按字节读取文件内容、按字符读取文件内容、按行读取文件内容。 *  * 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。 * ...
  • zhaomindan
  • zhaomindan
  • 2011-07-08 16:56:01
  • 845

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

package test20140709; import java.io.BufferedReader; import java.io.File; import java.io.FileReader...
  • u010777931
  • u010777931
  • 2014-07-11 10:48:23
  • 1305

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

有些应用中,不一定必须要数据库支持,纪录可以保存在文本里,此时,如何对这些记录进行增删改查的操作呢?这里以C++标准库提供了一个类,来处理此类问题。该类以行为单位进行操作,设一条纪录存为一行。只要拿到...
  • ioriogami
  • ioriogami
  • 2005-03-01 21:29:00
  • 1944

<em>以行为单位读</em>写文本<em>文件</em>

如何<em>以行为单位读</em>写文本<em>文件</em> 综合评分:0 收藏评论举报 所需: 3积分/C币 下载个数: 1 开通VIP 立即下载 评论共有0条 <em>JAVA</em>读取<em>文件</em>——以行为单位读取 立即...
  • 2018年04月13日 00:00

Java读取文件内容的几种方式

package com.readfile; import java.io.BufferedReader; import java.io.File; import java.io.FileInputS...
  • heirenheiren
  • heirenheiren
  • 2014-10-02 14:43:18
  • 66256

如何以行为单位读写文本文件

在实际工作中我们常常需要以行为单位来操作文本文件,比如读写ini文件等等。如果我们用C或者C++的运行时库里的函数来操作稍嫌麻烦。如果你用MFC来做的话可以使用CStdioFile这个类。      ...
  • guanjinke
  • guanjinke
  • 2004-09-15 14:05:00
  • 1048

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

java txt文件读取
  • yxmaomao1991
  • yxmaomao1991
  • 2016-02-22 19:40:24
  • 1289

建立一个程序,写2个线程,同时对一个文件里面写入字符串,另外一个程序读取输出在控制台,保证读取的实时性。

第一个程序2个线程写入: package com.ly.IO; import java.io.BufferedReader; import java.io.BufferedWriter;...
  • baidu_33067393
  • baidu_33067393
  • 2015-11-24 15:16:11
  • 318
收藏助手
不良信息举报
您举报文章:以行为单位的文件处理程序
举报原因:
原因补充:

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