zoukankan      html  css  js  c++  java
  • check windows return character

    #ifndef _FILE_CHECK_H
    #define _FILE_CHECK_H
    #include <string.h>
    #include <vector>

    const int LINEBUFF_SIZE = 1024;
    const std::string TAB_REPLACE = "   ";
    const std::string TAB_STRING = " ";
    const std::string WINDOWS_RETURN = " ";
    const std::string UNIX_RETURN = " ";

    class FileCheck
    {
    public:
        FileCheck(void);
        ~FileCheck(void);

       bool checkFiles(const std::vector<std::string>& inFiles, std::vector<std::string>& messages);
       bool modifyFiles(const std::vector<std::string>& inFiles);
       void setOnlyCreateTmpFile(bool bval);
       int delTempFiles();

    private:
       bool modifyOneFile(const std::string& inFileName);
       bool checkOneFile(const std::string& inFileName, std::vector<std::string> & message);
       void replaceString(const std::string & seach, const std::string& replace,std::string & inoutStr);
       void trim(std::string &line);
       bool checkSpaceLastCharacter(std::string &line, bool winrt);
       std::string getTempFileName(const std::string fileName);
       void updateFile(const std::string& inFile, const std::string& outFile);
       bool m_OnlyCreateTmp;
       std::vector<std::string> m_TmpFiles;
    };

    #endif _FILE_CHECK_H

    #include "stdafx.h" //remove later
    #include "FileCheck.h"
    #include <time.h>

    FileCheck::FileCheck(void)
    : m_OnlyCreateTmp(false)
    {
    }

    FileCheck::~FileCheck(void)
    {
    }

    bool FileCheck::modifyFiles(const std::vector<std::string>& inFiles)
    {
       std::vector<std::string>::const_iterator it = inFiles.begin();
       for(; it != inFiles.end(); ++it)
       {
          modifyOneFile(*it);
       }
       return true;
    }

    bool FileCheck::modifyOneFile(const std::string& inFileName)
    {
       if (inFileName.empty())
        {
            return false;
        }

        FILE * fp = NULL;
       FILE * fpCopy = NULL;
        
       fp = fopen(inFileName.c_str(), "rb");

       std::string temFileName = getTempFileName(inFileName);

       fpCopy = fopen(temFileName.c_str(),"wb");

       if (!fp || !fpCopy)
       {
          return false;
       }

       while (!feof(fp))
        {
          char buffer[LINEBUFF_SIZE + 1];
          memset(buffer,0,sizeof(buffer));
          int linNum = 1;
          if (fgets(buffer,LINEBUFF_SIZE,fp))
          {
             std::string line = buffer;
             trim(line);
             replaceString(TAB_STRING,TAB_REPLACE,line);
             replaceString(WINDOWS_RETURN,UNIX_RETURN,line);
             memcpy(buffer,line.c_str(),line.size());
             fwrite(buffer,sizeof(char),line.size(),fpCopy);
             linNum++;
          }
        }

       if (fp)
       {
          fclose(fp);
       }

       if(fpCopy)
       {
          fclose(fpCopy);
       }

       if (!m_OnlyCreateTmp)
       {
          updateFile(temFileName,inFileName);

          remove(temFileName.c_str());
       }
       else
       {
          m_TmpFiles.push_back(temFileName);
       }
       return true;
    }

    void FileCheck::replaceString(const std::string & seach, const std::string& replace,std::string & inoutStr)
    {
       if (!inoutStr.empty())
       {
          size_t pos = 0;
          pos = inoutStr.find(seach,pos);
          while (pos != std::string::npos)
          {
             inoutStr.replace(pos,seach.size(),replace);
             pos+=seach.size();
             pos = inoutStr.find(seach,pos);
          }
       }
    }

    void FileCheck::trim(std::string &line)
    {
       if (!line.empty())
       {
          size_t endPos = line.length() - 1;
          while (endPos)
          {
             if (isspace(line[endPos]))
             {
                endPos --;
             }
             else
             {
                break;
             }
          }

          if (endPos < line.length() - 1 )
          {
             line.replace(endPos+1,(line.length() - endPos - 2),"");
          }
       }

    }

    bool FileCheck::checkSpaceLastCharacter(std::string &line ,bool winrt)
    {
       bool ret = false;

       if (!line.empty())
       {
          size_t endPos = line.length() - 1;
          if (endPos)
          {
             endPos --;
             if (winrt && endPos)
             {
                endPos--;
                if(endPos && isspace(line[endPos]))
                {
                   ret = true;
                }
             }
             else if (endPos)
             {
                if(isspace(line[endPos]))
                {
                   ret = true;
                }            
             }
          }
       }

       return ret;
    }

    std::string FileCheck::getTempFileName(const std::string fileName)
    {
       char buffer[255];
       memset(buffer,0,255);
       const time_t t = time(NULL);
       struct tm* current_time = localtime(&t);
       if (current_time)
       {
          sprintf_s(buffer,"%d%d%d%d%d%d",
             current_time->tm_year + 1900,
             current_time->tm_mon + 1,
             current_time->tm_mday,
             current_time->tm_hour,
             current_time->tm_min,
             current_time->tm_sec);
       }

       std::string tmpFileName;
       size_t dotPos = fileName.rfind('.');
       if (dotPos != std::string::npos)
       {
          std::string extName = fileName.substr(dotPos);
          tmpFileName = fileName.substr(0,dotPos);
          tmpFileName += "_template";
          tmpFileName += buffer;
          tmpFileName += extName;
       }
       return tmpFileName;
    }

    void FileCheck::updateFile(const std::string& inFile, const std::string& outFile)
    {
       if (inFile.empty() || outFile.empty())
       {
          return;
       }

       FILE * fpFrom = fopen(inFile.c_str(),"rb");
       FILE * fpTo = fopen(outFile.c_str(),"wb");
       
       if (fpFrom && fpTo)
       {
          fseek(fpFrom,0,SEEK_END);
          long len = ftell(fpFrom);
          fseek(fpFrom,0,SEEK_SET);
          char *temp = new char[len];
          memset(temp,0,len);
          fread(temp,sizeof(char),len,fpFrom);
          fwrite(temp,sizeof(char),len,fpTo);
          delete [] temp;
          fclose(fpFrom);
          fclose(fpTo);
       }
    }

    void FileCheck::setOnlyCreateTmpFile(bool bval)
    {
       m_OnlyCreateTmp = bval;
    }

    int FileCheck::delTempFiles()
    {
       int rmNum = 0;

       if (m_OnlyCreateTmp && m_TmpFiles.size() > 0)
       {
          std::vector<std::string>::const_iterator it = m_TmpFiles.begin();
          for (; it != m_TmpFiles.end(); ++it)
          {
             rmNum++;
             remove((*it).c_str());
          }
       }

       return rmNum;
    }


    bool FileCheck::checkFiles(const std::vector<std::string>& inFiles, std::vector<std::string>& messages)
    {
       std::vector<std::string>::const_iterator it = inFiles.begin();
       for(; it != inFiles.end(); ++it)
       {
          checkOneFile(*it,messages);
       }
       return true;
    }

    bool FileCheck::checkOneFile(const std::string &inFileName, std::vector<std::string> & messages)
    {
       if (inFileName.empty())
        {
            return false;
        }

        FILE * fp = NULL;
        
       fp = fopen(inFileName.c_str(), "rb");

       if (!fp)
       {
          return false;
       }

       int linNum = 1;

       while (!feof(fp))
        {
          char buffer[LINEBUFF_SIZE + 1];
          char msgBuffer[LINEBUFF_SIZE + 1];
          memset(buffer,0,sizeof(buffer));
          memset(msgBuffer,0,sizeof(msgBuffer));
          bool isReturn = false;
          
          if (fgets(buffer,LINEBUFF_SIZE,fp))
          {
             std::string line = buffer;
             std::string msg;
             if (line.find(TAB_STRING,0) != std::string::npos)
             {
                sprintf_s(msgBuffer, sizeof(msgBuffer), "tab:%d ", linNum);
                msg.append(msgBuffer);
             }

             if (line.find(WINDOWS_RETURN,0) != std::string::npos)
             {
                sprintf_s(msgBuffer, sizeof(msgBuffer), "return:%d ", linNum);
                msg.append(msgBuffer);
                isReturn = true;
             }

             if (checkSpaceLastCharacter(line,isReturn))
             {
                sprintf_s(msgBuffer, sizeof(msgBuffer), "space:%d ", linNum);
                msg.append(msgBuffer);
             }

             if (!msg.empty())
             {
                msg.append("-->");
                msg.append(inFileName);
                messages.push_back(msg);
             }
             linNum++;
          }
        }

       if (fp)
       {
          fclose(fp);
       }

       return true;
    }

  • 相关阅读:
    轻量级数据库sqlite的使用
    Integer引发的思考
    css限制显示行数
    数据库 chapter 17 数据仓库与联机分析处理技术
    数据库 chapter 15 对象关系数据库系统
    数据库 chapter 16 XML数据库
    数据库 chapter 14 分布式数据库系统
    数据库 chapter 11 并发控制
    数据库 chapter 12 数据库管理系统
    数据库 chapter 13 数据库技术新发展
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/4576313.html
Copyright © 2011-2022 走看看