#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 = "\t";
const std::string WINDOWS_RETURN = "\r\n";
const std::string UNIX_RETURN = "\n";

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;
}

check windows return character的更多相关文章

  1. ABAP程序中退出操作(CHECK, EXIT, RETURN, LEAVE PROGRAM)

    这里总结一下几个常用的退出操作:  CHECK.(SAP官方推荐只在循环中使用) 1)CHECK 后面要跟一个表达式,当表达式值为假(false)时,CHECK发生作用,退出循环(LOOP)或处理程序 ...

  2. How to check Windows 7 OS is permanently activated?[Windows 7]

    Press Windows + R, then you can enter : slmgr.vbs -xpr

  3. DB INIT IN WINDOWS (FOR 12C)

    Uat       oracleDB-Uat  192.168.63.121        Windows server 2012 R2         2核12G,硬盘160G 内置用户是oaadm ...

  4. wxpython wx.windows的API

    wx.Window is the base class for all windows and represents any visible object on screen. All control ...

  5. [转]Installing SharePoint 2013 on Windows Server 2012 R2

    转自:http://www.avivroth.com/2013/07/09/installing-sharepoint-2013-on-windows-server-2012-r2-preview/ ...

  6. windows环境:idea或者eclipse指定用户名操作hadoop集群

    方法 在系统的环境变量或java JVM变量添加HADOOP_USER_NAME(具体值视情况而定). 比如:idea里面可以如下添加HADOOP_USER_NAME=hdfs 原理:直接看源码 /h ...

  7. dhcpsrv:windows系统的优秀开源免费dhcp serve软件

    概述: 官方网站 :http://www.dhcpserver.de/ 写博客时的可免费下载版本  2.52, 或者在cnblogs 本地下载 --========================== ...

  8. Python2.7在Windows下CMD编码为65001/utf-8时print报错[Errno 0]/[Errno 2]

    使用python2.7处理unicode的字符串,环境变量已设置PYTHONIOENCODING为utf-8,cmd编码为utf-8时print unicode字符串会报错[Errno 0]或[Err ...

  9. python2.7.6安装easy_install (windows 64 环境)

    1.复制以下代码保存到easy_install.py文件中(文件名可随意命名)并将该文件放到python的安装路径中(如:D:\Python27) #!/usr/bin/env python &quo ...

随机推荐

  1. phpeclipse常用快捷键

    phpeclipse常用快捷键

  2. 当前主流的安卓APP开发IDE

    什么是主流的开发安卓APP的方式? 我是去年4月份接触的Android开发,因此特别有感触,可以明显的感受到安卓APP主流开发方式的改变. 去年,2015年年初,各大安卓开发群大部分大牛在用Eclip ...

  3. Java笔记——面向切面编程(AOP模式)

    原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面 ...

  4. SIM卡

    SIM卡是(Subscriber Identity Module 客户识别模块)的缩写 也称为用户身份识别卡.智能卡,GSM数字移动电话机必须装上此卡方能使用.在电脑芯片上存储了数字移动电话客户的信息 ...

  5. iOS:授权用户定位NSLocationManager的使用

    请求用户批准定位: 在iOS8,要想获得用户的位置,必须经过用户批准授权 开发者可以在Info.plist中添加两个配置项 –NSLocationAlwaysUsageDescription –NSL ...

  6. python流程控制语句 ifelse - 3

    #! /usr/bin/python x = input ('please inut a integer:') x = int(x) : print ('你输入了一个负数') elif x == : ...

  7. 共有19款Java 文件上传组件开源软件

    http://www.oschina.net/project/tag/139/fileupload?lang=19&sort=view

  8. HDU 4629 Burning 几何 + 扫描线

    总体思路参考了 这里. 细节:1.控制精度,虽然这题没卡精度,不过还是要控制一下. 之前 bool operator<( const Point& A, const Point& ...

  9. GitHub 教程 in Ubuntu

    Follow these steps to configure github if you are the first time to use Github 1. Sign up a username ...

  10. 每天一个小算法(Heapsort)

    #include "stdio.h" #include "stdlib.h" #define Num 10 Heap(int arr[],int i,int n ...