寫了 windows RC 資源多語言string 替換的程序,發出來看下。

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <cstring>
#include <fstream>      // std::ifstream
#include <map>
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream


using namespace std;


vector< string > readfile1( char * pcFilename);
char  *delete_space(char src[]);
map< string ,string> VectorToMap( vector< string > a );
void SplitString(const string& s, vector<string>& vStore, const string& c);
map< string, string > changTheValue( map< string, string > mapEnglishRC, map< string, string > mapOtherRC);
void writeFile( string sInputFileName, string sOutputFilename, map< string, string> mapChange );
void StringToFirstStringSecondString(string inputString, string &firstString, string &secondString);
int  main(int   argc,   char*   argv[])
{

    vector< string > vEnglistStr;
    vector< string > vOtherStr;
    map< string, string > mapEnglishRC;
    map< string, string > mapOtherRC;
    //vEnglistStr = readfile1("en.txt");
    //vOtherStr = readfile1("rus.txt");
    vEnglistStr = readfile1(argv[1]);
    vOtherStr = readfile1(argv[2]);
    mapEnglishRC = VectorToMap( vEnglistStr );
    mapOtherRC = VectorToMap( vOtherStr );
    mapEnglishRC = changTheValue( mapEnglishRC, mapOtherRC );

    //writeFile( "en.txt", "output.txt", mapEnglishRC );
    writeFile( argv[1], argv[3], mapEnglishRC );
    cout << "Hello world!" << endl;
    return 0;
}

vector<string> readfile1( char * pcFilename)
{

    ifstream in(pcFilename);
	string line;
	string strInputLine ;
	vector< string> vec_store_line;
	bool bFlag =false;
	if(in) // 有該文件
	{
		while (getline (in, line)) // line中不包括每行的換行符
		{
		    if(line.size() == 0)
                continue;
		    char *pcInputLine = delete_space( const_cast<char*> ((line.c_str() )));
		    string strInputLine = string( pcInputLine );
		    if (strInputLine == "STRINGTABLE")
		    {
		        bFlag = true;
		        continue;
		    }

            if (strInputLine == "BEGIN")
                continue;
            if (strInputLine == "END")
                continue;
            if (bFlag == false)
            {
                continue;
            }
            cout << strInputLine << endl;
            vec_store_line.push_back( strInputLine );
        }
	}
	else // 沒有該文件
	{
		cout <<"no such file" << endl;
	}

	return vec_store_line;
}

char  *delete_space(char src[])
{void writeFile( string sInputFileName, string sOutputFilename, map< string, string> mapChange );
    char *ret = src;
    char *p1 = src;
    char *p2;

    if (NULL == src)
        return NULL;

    while (*p1 == ' ' || *p1 == '\t')//跳過最前面空白字符(這裏增加了2樓提到的'\t'字符)
        p1++;
    p2 = p1;
    while (*p2)
        p2++;
    while (--p2 >= src && (*p2== ' ' || *p2 == '\t'))//跳過最後面空白字符
        ;
    while (p1 <= p2)
        *src++ = *p1++;//拷貝中間部分
    *src = 0;

    return ret;
}


void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
{
  std::string::size_type pos1, pos2;
  pos2 = s.find(c);
  pos1 = 0;
  while(std::string::npos != pos2)
  {
    v.push_back(s.substr(pos1, pos2-pos1));

    pos1 = pos2 + c.size();
    pos2 = s.find(c, pos1);
  }
  if(pos1 != s.length())
    v.push_back(s.substr(pos1));
}

map<string ,string> VectorToMap( vector< string > myvector )
{
    map< string,string> mapString;
    vector<string>::iterator it ;
    for (it = myvector.begin() ; it != myvector.end(); ++it)
    {
        if( string(*it).size() == 0 )
            continue;
        vector<string> vStoreFirstSecond;
        SplitString(*it, vStoreFirstSecond, "\"");
        string sFirstString( delete_space( const_cast<char*> ((vStoreFirstSecond[0].c_str() ))));
        string sSecondString( delete_space( const_cast<char*> ((vStoreFirstSecond[1].c_str() ))));
        cout<< sFirstString<<endl;
        cout<< sSecondString<<endl;
        mapString.insert( pair<string,string>( sFirstString, sSecondString ) );

    }
    return mapString;
}

map< string, string > changTheValue( map< string, string > mapEnglishRC, map< string, string > mapOtherRC)
{

 for( map< string, string>::iterator it = mapEnglishRC.begin(); it != mapEnglishRC.end(); it++)
 {
     map< string, string>::iterator itOtherRC;
     itOtherRC = mapOtherRC.find( it -> first );
     if(itOtherRC == mapOtherRC.end())
     {
        continue;
     }
     else
     {
        it -> second = itOtherRC ->second;
     }
 }

 return mapEnglishRC;

}

void writeFile( string sInputFileName, string sOutputFilename, map< string, string> mapChange )
{
  ifstream fin(sInputFileName.c_str());
  string line;
  if(!fin){
    cout<<"File open error!\n";
    return;
  }
  ofstream fout(sOutputFilename.c_str());
  while(!fin.eof())
  {
    getline(fin, line);
    if(line.size() == 0)
    {
        fout<<"\n"<<endl;
        continue;
    }
    char *pcInputLine = delete_space( const_cast<char*> ((line.c_str() )));
    string strInputLine = string( pcInputLine );


    vector<string> vStoreFirstSecond;
    SplitString(strInputLine, vStoreFirstSecond, "\"");
    if(vStoreFirstSecond.size()>1)
    {
        string sFirstString( delete_space( const_cast<char*> ((vStoreFirstSecond[0].c_str() ))));
        string sSecondString( delete_space( const_cast<char*> ((vStoreFirstSecond[1].c_str() ))));
        map< string, string>::iterator it;
        it = mapChange.find( sFirstString );
        string temp = sFirstString +"      "+"\""+it -> second +"\""+"\n";
        cout<< temp<<endl;
        fout << sFirstString <<"      "<<"\""<< it -> second <<"\""<<endl;
    }
    else
    {
        fout <<strInputLine<<endl;
        cout<<strInputLine<<endl;
    }
  }
  fin.close();
  fout.close();
}

void StringToFirstStringSecondString(string inputString, string &firstString, string &secondString)
{
        vector<string> vStoreFirstSecond;
        SplitString(inputString, vStoreFirstSecond, "\"");
        string sFirstString( delete_space( const_cast<char*> ((vStoreFirstSecond[0].c_str() ))));
        string sSecondString( delete_space( const_cast<char*> ((vStoreFirstSecond[1].c_str() ))));
        firstString  = sFirstString;
        secondString = sSecondString;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章