读书人

大三暑假眼保健操之IO资料与std:strin

发布时间: 2012-08-30 09:55:54 作者: rapoo

大三暑假眼保健操之IO文件与std::string共舞__9

昨天刚把词法分析器写完 目前初步的打算是先把编译器的功能写好 然后在做UI 下一步是 语法分析器

今天看了下文件 写了半个文件类 功能也写了几个 希望能给大家点启发

友情提示 string 可以存4G以下的内容 :) why ? try to std::string::max_size();

#include<iostream>#include<string>#include<fstream>class CFileError{public:explicit CFileError(const char* _info)throw():m_Info(_info){}~CFileError()throw(){}public:const char* What()const throw(){return m_Info;}private:const char* m_Info;};class CFile{public:explicit CFile(const char* _filename = "F:\\VC\\MyProjects\\origin\\1.txt");~CFile();public:void ReadFile()throw(CFileError);//非二进制读取void PrintToConsole()const;//输出到控制台void OutPutFileName()throw(CFileError);//输出文件名&&路径void OutPutFileInFo(char _ch = '\n'/*为统计_ch的个数*/);//输出文件的一些信息 如:行数void MatchCharPair(char _chL = '{', char _chR = '}');//匹配字符对 可以自己定义private:std::stringm_FileName;std::ofstreamm_OFile;std::ifstream       m_IFile;size_tm_Info;//信息统计std::string         m_FileContent;size_t              m_FileSize;};CFile::CFile(const char* _filename ):m_FileName(_filename),m_Info(0),m_FileSize(0){}CFile::~CFile(){}void CFile::ReadFile()throw(CFileError){m_IFile.open(m_FileName.c_str(), std::ios_base::in );if(!m_IFile)throw CFileError("文件打开失败");m_IFile.seekg(0, std::ios::end);m_FileSize = m_IFile.tellg();m_FileContent.reserve(m_FileSize);m_IFile.seekg(0, std::ios::beg);while(!m_IFile.eof()){m_FileContent += m_IFile.get();}m_IFile.close();return ;}inline void CFile::PrintToConsole()const{std::cout<<m_FileContent<<std::endl;std::cout<<"文件大小"<<m_FileSize<<"个字节(包括\n\r)"<<std::endl;}void CFile::OutPutFileName()throw(CFileError){size_t found = m_FileName.find_last_of("/\\");if(found != std::string::npos){std::cout<<"文件名为 :"<<m_FileName.substr(found+1)<<std::endl;std::cout<<"文件夹路径为 :"<<m_FileName.substr(0, found)<<std::endl;}else{std::cout<<"文件名为 :"<<m_FileName<<std::endl;}}void CFile::OutPutFileInFo(char _ch){size_t found = m_FileContent.find_first_of(_ch);m_Info = 0;while(found != std::string::npos){m_Info++;found = m_FileContent.find_first_of(_ch, found+1);}std::cout<<m_Info;}//匹配思想是为了快速找出{}所以向下匹配_chL向上匹配_chR//仅仅如此 并没有按照语法顺序的匹配//foundR是从下往上找 foundL是从上往下找void CFile::MatchCharPair(char _chL, char _chR){size_t foundL = m_FileContent.find_first_of(_chL);size_t foundR = m_FileContent.find_last_of(_chR);m_Info = 0;if(foundL == std::string::npos){std::cout<<"不存在"<<_chL<<std::endl;return;}else if(foundR == -1){std::cout<<"不存在"<<_chR<<std::endl;}else{while(foundL != std::string::npos && foundR != std::string::npos){m_Info++;foundR = m_FileContent.find_last_of(_chR, foundR-1);foundL = m_FileContent.find_first_of(_chL, foundL+1);}if(foundL != std::string::npos){std::cout<<"匹配失败: "<<_chL<<"在"<<foundL-1<<"处时,向下缺少匹配串"<<_chR<<std::endl;}else if(foundR != std::string::npos){std::cout<<"匹配失败: "<<_chR<<"在"<<foundR<<"处时,向上缺少匹配串"<<_chL<<std::endl;}else{std::cout<<"匹配成功! 共有"<<m_Info<<"对"<<std::endl;}}return ;}int main(){try{CFile test;test.ReadFile();test.PrintToConsole();test.OutPutFileName();std::cout<<"有 ";test.OutPutFileInFo();std::cout<<"行"<<"\t";test.OutPutFileInFo(' ');std::cout<<"个空格"<<std::endl;test.MatchCharPair();}catch(CFileError& e){std::cout<<e.What()<<std::endl;}catch(...){std::cout<<"Unknown Error"<<std::endl;}return 0;}


读书人网 >编程

热点推荐