C++:替換文字中的指定字串
阿新 • • 發佈:2019-01-05
替換文字檔案或者二進位制檔案中的指定字串
// 方法一
// 將原始檔中的特定字串替換,內容輸出到新檔案中
bool FileStringReplace(ifstream &instream, ofstream &outstream)
{
string str;
size_t pos = 0;
while (getline(instream, str)) // 按行讀取
{
pos = str.find("Tom"); // 查詢每一行中的"Tom"
if (pos != string::npos)
{
str = str.replace(pos, 3, "Jerry"); // 將Tom替換為Jerry
outstream << str << endl;
continue;
}
outstream << str << endl;
}
return true;
}
// 方法二(bug 較多,不推薦)
// 不建立新檔案,直接在原始檔上修改指定字串(覆蓋方法,新字串比原字串長的時候才能使用)。指標位置對應函式(tellg seekg <-> tellp seekp)
bool FixNewFile(fstream &fixstream)
{
string str;
size_t cur; // 記錄讀指標位置
size_t pos = 0;
while (getline(fixstream, str))
{
pos = str.find("Tom");
if (pos != string::npos)
{
cur = fixstream.tellg();
size_t len = strlen(str.c_str()) + 2;
fixstream.seekp(-1 * len, fstream::cur); // (讀寫指標本來在相同位置),此時寫指標回退到上一行
str.replace(pos, 3, "Jerry" );
//fixstream.clear();
fixstream << str;
fixstream.seekp(cur); // 寫指標位置還原
continue;
}
}
return true;
}
// 主函式
int main()
{
string file_path = "F:\\mtl_std_lod1.fx";
string out_path = "F:\\mtl_std_lod1.glsl";
ifstream instream(file_path); // instream.open(file_path) 預設以ifstream::in開啟
ofstream outstream(out_path); // outstream.open(out_path) 預設以ostream::out開啟,檔案內容會被丟棄,可使用app模式(寫指標會被定位到檔案末尾)
FileStringReplace(instream, outstream);
instream.close();
outstream.close();
fstream fixstream(out_path); // fstream 預設以讀寫方式開啟檔案,支援對同一檔案同時讀寫操作
FixNewFile(fixstream);
fixstream.close();
//system("pause");
return 0;
}