C++对文件(fstream)中字符串的提取与操作(string类型的查找(find)与插入(insert))
**
任务
**
1 在测试文本中有多少个registration单词
2 给每个registration的末尾添加[n] n是registration出现的序号
例如第一次出现为registration【1】
第二次出现为registration【2】
…
3 把修改后的文件内容存到另一个文件里
思路
1 利用C++标准库里的fstream打开文件
2 将内容读取出并将内容转化为字符串格式
3 利用find函数对字符串进行registration的查找
4 将【n】中的数字n利用itoa函数转化成为字符串然后用insert函数插入到原字符串
5 创建一个新文件
6 将修改后的新字符串保存到创建的文件里
7 关闭文件
#include<iostream>
#include<string>
#include<fstream>
#include<map>
using namespace std;
int main()
{
fstream fp("C:\\Users\\24112\\Desktop\\text_prase.txt" );//打洙?开a文?件t
string str;
string str2;
string str3;
if(fp.is_open())
{
char mbzTemp[256];
while(fp>>mbzTemp!=NULL)
{
string str1=" ";
str = mbzTemp;//将文件内容转化为字符串
str +=str1;
str2 += str;//将文件内容转存到字符串内
}
}
string sub="registration";
int index=0,count=0,i=1;//index是下标,count是出现的次数
while( (index=str2.find(sub,index)) < str2.length() )//字符串查找
{
count++;
//cout<<"位置:"<<index<<" ";
index++;
str2.insert(index+11,"[""]");//先插入中括号
char str3[6];//保存字符串
itoa(count,str3,10);//将count转化成字符串
str2.insert(index+12,str3);//将转化后的字符串插入
}
//cout<<str2;
ofstream text;
text.open("text_prase_modify.txt", ios::out | ios::app); //以写入和在文件末尾添加的方式打开.txt文件,没有的话就创建该文件。
if (!text.is_open())
return 0;
text << str2 << endl;
text.close();//关闭文件
}
这是未修改之前的txt文件的截图,已经标记一处registration,共有五处
这是运行后的文件截图
知识点讲解
1 看这一段代码
char mbzTemp[256];
while(fp>>mbzTemp!=NULL)
{
string str1=" ";
str = mbzTemp;//将文件内容转化为字符串
str +=str1;
str2 += str;//将文件内容转存到字符串内
}
利用流的方式将文件内容存到数组mbzTemp中,str字符串利用读取的其实是一个一个单词,因此我们要将str累加起来才是完整的文本内容,而一开始让str加上一个空格字符串是为了把单词隔开,就是helloworld与hello world的区别。
str2.find(sub,index)的意思是在字符串str2中寻找sub这个字符串,找到以后返回下标(位置)index.
char str3[6];//保存字符串
itoa(count,str3,10);//将count转化成字符串itoa函数就是将数字转化成字符串,由于数字是无法直接插到字符串里的,所以使用itoa函数,itoa(count,str3,10);count是要转化的数字,str3是转化后的存储位置,10代表的是十进制转化。
str2.insert(index+12,str3)直接解释,insert插入函数,str2是需要插入到str2里,index+12是指要插入的下标(位置),str3是将要插入的字符串,简单来说就是将str3插入到sre2的index+12的位置。
后面的代码注释已经很清楚了。