求某个功能更高效的办法。。。。

wangsiyuanoo 2009-04-28 10:35:06
//.h
vector<string> m_FileList; //一共存放了221个文件(cpp文件)
vector<string> m_ChineseKeyWordList; //一共存放了3900个中文关键字
vector<string> m_EnglishReplaceWordList; //一共也存放了3900个英文替换字,去替换上面的中文。
////m_ChineseKeyWordList和m_EnglishReplaceWordList是一一对应的。

//.cpp
for (int i = 0; i < (int)m_FileList.size(); i++)
{
string strFilePath = m_FileList[i]; //文件


for (int m = 0; m < (int)m_ChineseKeyWordList.size(); m++)
{
string strContent = "";
string line = "";
int pos = 0;

string strKeyWord = m_ChineseKeyWordList[m]; //中文关键字

//一行行的读m_FileList中存放的文件
fstream file(strFilePath.c_str(), ios::in|ios::out);
if (!file)
return;
while(getline(file, line))
{
if((pos = (int)line.find(strKeyWord)) != -1)
{
string strReplaceWord = m_EnglishReplaceWordList[m]; //英文替换字

line.replace(pos, strKeyWord.length(), strReplaceWord.c_str()); //中文 替换 英文
}

strContent += line + "\n";
}

file.clear();
file.sync();
file.seekp(0);
file << strContent;
strContent = "";
}
}


我的问题是:
从代码里可以知道,221个cpp文件的每一个文件里都要一行行的把m_ChineseKeyWordList中存放的3900个中文关键字给遍历一下,如果有,就用英文将他替换掉。

但当某个cpp文件有超多行的时候,比如几万行,这个搜索替换就会很慢很慢........

想问,有更高效的方法么?

(目前并不能定位到哪一行存在关键字。)
...全文
165 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangsiyuanoo 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhh157 的回复:]
根据我的理解,将楼主的代码改了一下
可以确定的是,文件不需要打开多次,不需要一行一行的处理


C/C++ code
//.h
vector<string> m_FileList; //一共存放了221个文件(cpp文件)
vector<string> m_ChineseKeyWordList; //一共存放了3900个中文关键字
vector<string> m_EnglishReplaceWordList; //一共也存放了3900个英文替换字,去替换上面的中文。
//…
[/Quote]

你的意思是说:把所有内容都放在一个字符串中,然后一起替换,这样就不需要一行行的去找了,是吧?
old-six-programmer 2009-04-28
  • 打赏
  • 举报
回复
上面的find修改成以下,效率会更高些

while( ( pos = strFileContent.find( strKeyWord, pos ) ) != string::npos )
old-six-programmer 2009-04-28
  • 打赏
  • 举报
回复
根据我的理解,将楼主的代码改了一下
可以确定的是,文件不需要打开多次,不需要一行一行的处理


//.h
vector<string> m_FileList; //一共存放了221个文件(cpp文件)
vector<string> m_ChineseKeyWordList; //一共存放了3900个中文关键字
vector<string> m_EnglishReplaceWordList; //一共也存放了3900个英文替换字,去替换上面的中文。
////m_ChineseKeyWordList和m_EnglishReplaceWordList是一一对应的。

//.cpp
for (int i = 0; i < (int)m_FileList.size(); i++)
{
string strFilePath = m_FileList[i]; //文件
fstream file( strFilePath.c_str(), ios::in|ios::out );
if( !file ) return;

//每个文件只打开一次,将文件内容导入到字符串中处理
int nFileLen = file.get();
char* pFileContent = new char[nFileLen];
if( !( file.get( pFileContent, nFileLen ) ) continue;

string strFileContent;
strFileContent.append( pFileContent, nFileLen );

for (int m = 0; m < (int)m_ChineseKeyWordList.size(); m++)
{
string strKeyWord = m_ChineseKeyWordList[m]; //中文关键字

string::size_type pos;
while( ( pos = strFileContent.find( strKeyWord ) ) != string::npos )
strFileContent.replace( pos, strKeyWord.size(), m_EnglishReplaceWordList[m].c_str() );
}

//将处理过的字符串,重新输出到文件中去
...
}
wangsiyuanoo 2009-04-28
  • 打赏
  • 举报
回复
vector<string> m_FileList; //一共存放了221个文件(cpp文件)
vector<string> m_ChineseKeyWordList; //ChineseKeyWordList是从一个TXT中读出来的
vector<string> m_EnglishReplaceWordList; //EnglishReplaceWordList也是从一个TXT中读出来的

现在问题是,中英文文本里已经保证了一一对应的关系,也就是说,中文txt的第一行翻译成的英文必定是英文txt的第一行,以此类推。所以感觉这样用vector和map得到的效果是一样的。
我的问题主要是,因为我要保证要读的文件,每一行是否有个这个中文,有,就拿英文替换。那么这样必然是要一行行的去读了,如果一个cpp有10000行,我有4000个中文需要一行行的搜索,一个中文就要搜索一下这10000行,那么4000个中文这样搜索就会很慢。
我只是想问,有没更好的办法去取代这个方法。
Jarrys 2009-04-28
  • 打赏
  • 举报
回复
map<m_ChineseKeyWordList,m_EnglishReplaceWordList> m_ChineseKeyWordList作为键,m_EnglishReplaceWordList作为关联对象

把中文字,和要替换的英文都保存在map容器中,它们之间是一一对应的关系,当要替换时就不必查找了,直接用键作下标就能访问要替换的文本
  • 打赏
  • 举报
回复
你说下具体需求,读出来存在map<string,set<..> >里。
liliangbao 2009-04-28
  • 打赏
  • 举报
回复
帮顶~
wangsiyuanoo 2009-04-28
  • 打赏
  • 举报
回复
有谁帮帮我。。。。。
wangsiyuanoo 2009-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
兄弟,不会知道vector,不知道map、set吧?
[/Quote]
知道。。。
但用的少。。。
具体点好么
谢谢了~~~~~~
wangyadong 2009-04-28
  • 打赏
  • 举报
回复
帮顶!
taodm 2009-04-28
  • 打赏
  • 举报
回复
兄弟,不会知道vector,不知道map、set吧?
wangsiyuanoo 2009-04-28
  • 打赏
  • 举报
回复
   int nFileLen = file.get();
char* pFileContent = new char[nFileLen];
if( !( file.get( pFileContent, nFileLen ) ) continue;

string strFileContent;
strFileContent.append( pFileContent, nFileLen );

好像有点问题吧。。。
zhaohongbo83 2009-04-28
  • 打赏
  • 举报
回复
替换在里面怎么是把所有的内容放在一个字符串里,一起替换呢?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧