您的位置:首页 > 编程语言 > C语言/C++

【c++文本文件操作之查找且替换】mac系统xcode编译环境

2014-09-01 17:40 357 查看
#include <iostream>
#include<fstream>
#include <sys/dir.h>
#include <sys/stat.h>
using namespace std;

void myreplace(const string& filename,const string& tofind,const string& toreplace);
bool isDir(const char* path);
void replaceInFiles(const char *path, const string& tofind, const string& toreplace);
void replaceInFiles(const char *path, const string& tofind, const string& toreplace, int recursive);

int main()
{
replaceInFiles("/Users/xuconglong/Desktop/text2", "n", "x");
return 0;
}

void myreplace(const string& filename,const string& tofind,const string& toreplace)
{
ifstream fin(filename.c_str(),ios_base::binary);
string str(1024*1024*2,0);
fin.read(&str[0],2*1024*1024);
fin.close();
ofstream fout(filename.c_str(),ios_base::binary);

string::size_type beg=0;
string::size_type pos;
string::size_type find_size=tofind.size();
string::size_type replace_size=toreplace.size();

if(0 == find_size)
{
cout << "no such file or no content" << endl;
return;
}

unsigned count = 0;
while((pos=str.find(tofind,beg))!=string::npos)
{
fout.write(&str[beg],pos-beg);
fout.write(&toreplace[0],replace_size);
beg=pos+find_size;
count++;
}
fout.write(&str[beg],strlen(str.c_str())-beg);
fout.close();
cout << "has replaced number:" << count << endl;
}

bool isDir(const char* path)
{
struct stat st;
lstat(path, &st);
return 0 != S_ISDIR(st.st_mode);
}

//遍历文件夹的驱动函数
void replaceInFiles(const char *path, const string& tofind, const string& toreplace)
{
unsigned long len;
char temp[256];
//去掉末尾的'/'
len = strlen(path);
strcpy(temp, path);
if(temp[len - 1] == '/') temp[len -1] = '\0';

if(isDir(temp))
{
//处理目录
int recursive = 1;
replaceInFiles(temp, tofind, toreplace, recursive);
}
else   //输出文件
{
printf("path:%s\n", path);
myreplace(path, tofind, toreplace);
}
}

//遍历文件夹de递归函数
void replaceInFiles(const char *path, const string& tofind, const string& toreplace, int recursive)
{
DIR *pdir;
struct dirent *pdirent;
char temp[256];
try{
pdir = opendir(path);
}catch(const char *str)
{printf("failed open dir");}
if(pdir)
{
while((pdirent = readdir(pdir)))
{
//跳过"."和".."
if(strcmp(pdirent->d_name, ".") == 0
|| strcmp(pdirent->d_name, "..") == 0)
continue;
sprintf(temp, "%s/%s", path, pdirent->d_name);

//当temp为目录并且recursive为1的时候递归处理子目录
if(isDir(temp) && recursive)
{
replaceInFiles(temp, tofind, toreplace, recursive);
}
else
{
printf("path:%s\n", temp);
myreplace(temp, tofind, toreplace);
}
}
}
else
{
printf("opendir error:%s\n", path);
}
closedir(pdir);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ c