|
用标准c++写的...
于是也没有带图形界面...
class SlkTable:
构造函数:
SlkTable( string file_path)
参数是slk文件的路径
构造函数后,文件自动读入
函数:
const string& get( int x,int y)
返回x行y列的数据.( y可以比文件中的多,以便于插入数据.数据块最多可以添加ADD_LEN个,默认是10)
bool set( int x,int y,string str)
设置x行y列的数据. 注意,str并不需要外面的存储空间,因为内部会自己有一个copy
int get_length()
返回数据的总块数,也就是Y的最大值
int get_size()
返回数据块的最大行数,也就是X的最大值
bool save_to_file( string file_path)
把文件保存到一个文件中.
______________________file SlkTable.h__________________
#ifndef SlkTable_h
#define SlkTable_h
#include "Table.h"
#include<string>
using std::string;
#include<fstream>
using std::ifstream;
using std::ofstream;
class SlkTable
{
ifstream reader; //文件读取流
enum{ ADD_LEN=10}; //定义用户最多可以填加多少组数组
Table<string> table; //数据表
int length; //文件的长度
int size; //文件的数据量
int x; //当前读取到的x-1
int y; //当前读取到的y-1
string str; //本行的数据
public:
SlkTable( string file_name);
const string& get( int x,int y)
{
return table.get( x-1,y-1);
}
bool set( int x,int y,string str)
{
return table.set( x-1,y-1,str);
}
bool save_to_file( string file_name);
void get_file_size();
bool read_line();
int get_size(){ return size;}
int get_length(){ return length;}
};
#endif
___________________________file Table.h_____________________
#ifndef Table_h
#define Table_h
#include<vector>
using std::vector;
template<class T>
class Table
{
T** data;
int length;
int size;
T t_nil;
public:
class TableIndexError{};
Table( int _length=0,int _size=0)
:length( _length),size( _size)
{
data=new T*[size*length];
}
T& get( int x,int y)
{
if ( data[y*size+x]==0)
return t_nil;
else
return *data[y*size+x];
}
bool set( int x,int y,T t)
{
data[y*size+x]=new T(t);
}
};
#endif
_______________________file SlkTable.cpp________________
#include "SlkTable.h"
SlkTable::SlkTable( string file_name)
: reader( file_name.c_str() )
{
get_file_size();
x=0;
y=0;
str="";
table=Table<string>( length+ADD_LEN,size);
while( read_line() )
{
table.set( x,y,str);
}
reader.close();
}
void SlkTable::get_file_size()
{
char c;
reader>>str; //无用行
reader>>c; //c='B'
reader>>c; //c=';'
reader>>c; //c='Y'
reader>>length;
length+=ADD_LEN;
reader>>c; //c=';'
reader>>c; //c='X'
reader>>size;
reader>>str;
str="";
}
bool SlkTable::read_line()
{
char c;
if ( reader.eof()) return false;
reader>>c; //c='C'
if ( c!='C') return false;
reader>>c; //c=';'
reader>>c; //c是X或Y
if ( c=='Y')
{
reader>>y;
y--;
reader>>c; //c=';'
reader>>c; //c='X'
}
//这里,c一定是X了
reader>>x;
x--;
reader>>c; //c=';'
reader>>c; //c='K'
reader>>str;
return true;
}
bool SlkTable::save_to_file( string file_name)
{
ofstream writer( file_name.c_str());
//header
writer<<"ID;PWXL;N;E\n";
//file size& length
writer<<"B;Y"<<length<<";X"<<size<<";D0\n";
//data....
for ( int y=0;y<length;y++)
{
bool write_y=false;
for ( int x=0;x<size;x++)
{
if ( table.get(x,y)=="") continue;
if ( write_y==false)
{
write_y=true;
writer<<"C;Y"<<y<<";X"<<x<<";K"<<table.get(x,y)<<"\n";
}else
{
writer<<"C;X"<<x<<";K"<<table.get( x,y)<<"\n";
}
}
}
writer<<"E"<<endl;
} |
|