一、运行环境
codeblocks
gcc version 4.9.2 (tdm-1)
二、String内部描述
1、构造方法
构造方法 |
描述 |
String(char *s,int len) |
构造方法初始化数据 |
2、功能描述
成员方法 |
描述 |
char *getStr() |
获取当前的String(打印) |
int getLength() |
获取当前String的长度 |
char *Strcpy(char *s) |
字符串的复制 |
char *Strcat(char *s) |
字符串的连接 |
int Compare(char *b) |
字符串的比较 |
char *substring(int sub_start,int sub_end) |
指定起始终止位置求子串 |
void exchange(char *s) |
字符串的交换 |
int BF_Find_String(char *s) |
在当前字符串String中查找子串 |
int indexOf(char index) |
查找某字符在当前String中第一次出现的位置 |
void toUpperCase() |
字符串小写转大写 |
void toLowerCase() |
字符串大写转小写 |
char *trim() |
消除字符串中的空格 |
char *SplitStr() |
消除{,!”“#$%&’()*+,-./}的字符 |
void set(int index,char letter) |
在指定字符串的指定位置添加某字符 |
3、操作文件功能
操作文件方法 |
描述 |
void write_copy(char s1[30]) |
字符串复制结果写入文件 |
void write_connect(char s1[30]) |
字符串连接结果写入文件 |
void write_compare(char s1[15],char s2[15],int flag) |
字符串比较(compare)结果写入文件 |
void write_substring(char s1[15],char s2[15],int sub_start,int sub_end) |
将所求子串写入文件 |
void write_exchange(char s1[15],char s2[15],int flag) |
字符串交换前后数据写入文件 |
void write_BF_Find_String(char str[15],char s[15],int find_string_value) |
字符串的查找结果写入文件 |
void write_indexOf(char str[15],char index,int pos) |
将某字符在字符串第一次出现的位置写入文件 |
void write_LowerAndUpperCase(char s1[15],char s2[15]) |
将转换大小写结果写入文件 |
void write_trim(char s1[15],char s2[15]) |
消除字符串中的空格后结果写入文件 |
void write_SplitStr(char s1[15],char s2[15]) |
消除常用标点符号,!”“#$%&’()*+,-./的结果写入文件 |
void write_set(char s1[15],char s2[15],int index,char one_letter) |
将某字符添加到某字符串的某个位置的结果写入文件 |
void write_reverse_str(char s1[15],char s2[15]) |
将字符串翻转后写入文件 |
void write_initvalue(int n) |
起始写入文件的字符串 |
char * read(int count) |
读取文件指定位置的字符串 |
三、依赖
- #include< iostream>
- #include< string.h>
- #include< fstream>
- #include< malloc.h>
四、源码(不含测试)
/*************************************************************************
> File Name: 重写string类
> Author: 浅然
> Mail: [email protected]
> Created Time: 2018年05月21日 星期一 14时11分34秒
************************************************************************/
#include<iostream>
#include<string.h>
#include<fstream>
#include<malloc.h>
using namespace std;
char s[15];//读取文件中的数据时存储在s数组中
/*
*String
*成员属性:*str,length
*成员方法:
1.显示构造器:String(char *s,int len)
2.析构器:~String()
3.获取此时的string:char *getStr()
4.获取此时的length:int getLength()
5.字符串的复制:char *Strcpy(char *s)
6.字符串的连接:char *Strcat(char *s)
7.字符串的比较:int Compare(char *b).
8.求子串:char *substring(int sub_start,int sub_end)
9.字符串的交换:void exchange(char *s)
10.查找字符串(BF):int BF_Find_String(char *s)
11.求出现某字符在指定字符串中第一次出现的位置:int indexOf(char index)
12.字符串小写转大写:void toUpperCase().
13.字符串大写转小写:void toLowerCase().
14.消除字符串中的空格:char *trim().
15.消除{,!""#$%&'()*+,-./}的字符:char *SplitStr().
16.在指定字符串的指定位置添加某字符: void set(int index,char letter).
*/
class String
{
//成员变量
private:
char *str;
int length;
//构造器
public:
String(char *s,int len)
{
str=new char[strlen(s)+1];
strcpy(str,s);
length=len;
}
//析构器
~String()
{
delete[] str;
}
/*
*获取此时的string
*/
char *getStr(){
return str;
}
/*
*获取此时的length
*/
int getLength(){
return length;
}
/*
*字符串的复制
*/
char *Strcpy(char *s){
char *destinaton=new char[strlen(s)+1];//为destinaton开辟内存空间
strcpy(destinaton,s); //将s复制给destinaton
if(destinaton!=NULL){ //如果destinaton不为空,说明复制完成,且成功
cout<<"复制完成"<<endl;
}
if(str)
delete[]str; //释放str指向的内存
str=destinaton; //将str指向destinaton所指向的地址(赋值)
length=strlen(destinaton); //此时所用的字符串长度更新
return str;
}
/*
*字符串的连接
*/
char *Strcat(char *s){
char *original = new char[strlen(s)+strlen(str)+1];//为original开辟内存空间
strcpy(original,str); //将str复制给original
strcat(original,s); //将s与original连接
if(original!=str){ //如果original与str不相等,说明连接完成,且成功
cout<<"连接完成"<<endl;
}
return original;
}
/*
*字符串的比较
*/
int Compare(char *b){
int flag = 0; //比较大小标志域
int com = strcmp(str,b); //比较函数,得出大小
if(com == 0){ //com==0得出str==b
cout<<str<<"和"<<b<<"相等"<<endl;
flag=0;
}
else if(com<0){ //com<0得出str<b
cout<<str<<"小于"<<b<<endl;
flag=-1;
}
else if(com>0){ //com>0得出str>b
cout<<str<<"大于"<<b<<endl;
flag=1;
}
return flag;
}
/*
*求子串
*设置开始和结束位置求出子串
*/
char *substring(int sub_start,int sub_end)
{
char *low_string=new char[sub_end-sub_start+1];//为low_string开辟内存空间
int i=sub_start; //i初始化为所求子串在父串的初始位置
int j=0; //j为递增变量
while(i<=sub_end){ //确定i的范围,为low_string赋值
low_string[j++] = str[i++];
}
low_string[j]='\0';
return low_string;
}
/*
*字符串的交换
*/
void exchange(char *s)
{
char *temp_str = new char[length]; //为临时存放str的temp_str,开辟内存
char *temp_s = new char[strlen(s)+1]; //为临时存放s的temp_s开辟内存
cout<<"交换之前 :"<<s<<"\t"<<str<<endl;//打印交换前
strcpy(temp_str,str); //将str复制给temp_str,下同
strcpy(temp_s,s);
str=temp_s; //实现更新交互,更新str的值,下同
s=temp_str;
cout<<"交换之后 :"<<s<<"\t"<<str<<endl;//打印交换后
}
/*
*查找字符串(BF)
*设置从某位置开始查找子串
*/
int BF_Find_String(char *s)
{
int a,b;
int i=0,j=0;
a=strlen(str);
b=strlen(s);
j=0;
cout<<(" 请输入数i,代表从主串s哪个位置开始\n");
cin>>i;
while(j<b && i<a)
{
if(str[i]==s[j])
{
i++;
j++;
}
else
{
i=i-j+1;
j=0;
}
}
if(j>=b){
cout<<"匹配成功,查找成功\n";
return 1;
}
else{
cout<<"匹配失败,查找失败\n";
return -1;
}
}
/*
*求出现某字符在指定字符串中第一次出现的位置
*/
int indexOf(char index)
{
for(int i = 0;i < strlen(str);i++){
if(str[i] == index){
return i+1;
}
}
return 0;
}
/*
*字符串小写转大写
*/
void toUpperCase()
{
for(int i = 0; str[i]!='\0';i++){
if( str[i]>='a' && str[i]<='z'){
str[i] = str[i]-32;
}
}
}
/*
*字符串大写转小写
*/
void toLowerCase()
{
for(int i =0;str[i]!='\0';i++){
if(str[i]>='A' && str[i]<='Z'){
str[i] = str[i]+32;
}
}
}
/*
*消除字符串中的空格
*/
char *trim()
{
int j = 0;
int count = 0;
char *s = new char[strlen(str)+1];
for(int i = 0;i<strlen(str);){ //消除空格
if(str[i] == ' '){
i++;
continue;
}else{
s[j++] = str[i];
i++;
}
}
s[j]='\0'; //字符串结束
return s;
}
/*
*字符串分割
*消除{,!""#$%&'()*+,-./}的字符
*/
char *SplitStr()
{
int j = 0;
char *s = new char[strlen(str)+1];
for(int i = 0 ;i < strlen(str);){
if((int)str[i] >= 33 && (int)str[i] <= 47){
i++;
}else{
s[j++] = str[i];
i++;
}
}
s[j] = '\0';
return s;
}
/*
*将字符添加到字符串指定位置
*/
void set(int index,char letter)
{
int i = 0;
int j = strlen(str);
// char *s = str;
//str = (char*)realloc(s,100);
for(i = strlen(str)-1 ; i > index ; i--){
str[i+1] = str[i];
}
str[i+1] = str[i];
str[i] = letter;
str[j+1] = '\0';
length++;
}
/*
*字符串翻转
*/
char *reverse_str()
{
char temp;
char *temp_s = new char[strlen(str)+1];
strcpy(temp_s,str); //拷贝str到temp_s中
int i,j;
for(i=0; ;i++)
{
if(*(temp_s+i)=='\0')
break;
} //求字符串长度
i--;
for(j=0;j<=i;i--,j++)
{
temp=*(temp_s+j);
*(temp_s+j)=*(temp_s+i);
*(temp_s+i)=temp;
}
return temp_s; //字符串翻转
}
};
/*
*以下是文件写入操作
1.字符串复制结果写入文件:void write_copy(char s1[30])
2.字符串连接结果写入文件:void write_connect(char s1[30])
3.字符串比较(compare)结果写入文件:void write_compare(char s1[15],char s2[15],int flag)
4.将所求子串写入文件:void write_substring(char s1[15],char s2[15],int sub_start,int sub_end)
5.字符串交换前后数据写入文件:void write_exchange(char s1[15],char s2[15],int flag)
6.字符串的查找结果写入文件:void write_BF_Find_String(char str[15],char s[15],int find_string_value)
7.将某字符在字符串第一次出现的位置写入文件:void write_indexOf(char str[15],char index,int pos)
8.将转换大小写结果写入文件:void write_LowerAndUpperCase(char s1[15],char s2[15])
9.消除字符串中的空格后结果写入文件: void write_trim(char s1[15],char s2[15])
10.消除常用标点符号,!""#$%&'()*+,-./的结果写入文件:void write_SplitStr(char s1[15],char s2[15])
11.将某字符添加到某字符串的某个位置的结果写入文件:void write_set(char s1[15],char s2[15],int index,char one_letter)
12.将字符串翻转后写入文件: void write_reverse_str(char s1[15],char s2[15])
13.起始写入文件的字符串:void write_initvalue(int n)
14.读取文件指定位置的字符串:char * read(int count)
*/
/*
*copy结果写入文件
*/
void write_copy(char s1[30])
{
ofstream out;//向文件写入数据
//out:以写的方式打开
//ate:打开文件后立即定位到文件末尾
//app:每次写操作前均定位到文件末尾
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"字符串复制\n";
out<<"copy:"<<s1<<"\n\n";
out.close();
}
/*
*connect结果写入文件
*/
void write_connect(char s1[30])
{
ofstream out;//向文件写入数据
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"字符串连接\n";
out<<"connect:"<<s1<<"\n\n";
out.close();
}
/*
*字符串比较(compare)结果写入文件
*/
void write_compare(char s1[15],char s2[15],int flag)
{
ofstream out;//向文件写入数据
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"字符串比较\n";
if(flag == 0)
out<<s1<<"等于"<<s2<<"\n\n";
else if(flag == -1)
out<<s1<<"小于"<<s2<<"\n\n";
else if(flag == 1)
out<<s1<<"大于"<<s2<<"\n\n";
out.close();
}
/*
*将所求子串写入文件
*/
void write_substring(char s1[15],char s2[15],int sub_start,int sub_end)
{
ofstream out;//向文件写入数据
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"求子串\n";
out<<s2<<"通过起始位置:"<<sub_start<<"和结束位置"<<sub_end<<"所求的子串"<<s1<<"\n\n";
out.close();
}
/*
*字符串交换前后数据写入文件
*/
void write_exchange(char s1[15],char s2[15],int flag)
{
ofstream out;//向文件写入数据
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"字符串交换\n";
if(flag){
out<<"字符串交换后: old_string:"<<s1<<"\t"<<"new_string:"<<s2<<"\n\n";
}else{
out<<"字符串交换前: old_string:"<<s1<<"\t"<<"new_string:"<<s2<<"\n\n";
}
}
/*
*字符串的查找结果写入文件
*/
void write_BF_Find_String(char str[15],char s[15],int find_string_value)
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"字符串查找\n";
if(find_string_value == 1){
out<<str<<"与"<<s<<"匹配成功,查找成功\n\n";
}
else if(find_string_value == -1){
out<<str<<"与"<<s<<"匹配失败,查找失败\n\n";
}
}
/*
*将某字符在字符串第一次出现的位置写入文件
*/
void write_indexOf(char str[15],char index,int pos)
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out){
cout<<"文件打开失败!"<<endl;
}
out<<"查找"<<index<<"在"<<str<<"中第几号位置第一次出现亦或没有\n";
if(pos){
out<<index<<"在"<<str<<"的第:"<<pos<<"\n\n";
}
else{
out<<index<<"没有出现在string中\n\n";
}
}
/*
*将转换大小写结果写入文件
*/
void write_LowerAndUpperCase(char s1[15],char s2[15])
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
out<<"字符串大小写转换\n";
out<<s1<<"转换为"<<s2<<"\n\n";
out.close();
}
/*
*消除字符串中的空格后结果写入文件
*/
void write_trim(char s1[15],char s2[15])
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
out<<"忽略"<<s1<<"中的空格 : "<<s2<<"\n\n";
}
/*
*消除常用标点符号,!""#$%&'()*+,-./的结果写入文件
*/
void write_SplitStr(char s1[15],char s2[15])
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
out<<"忽略"<<s1<<"中的标点 : "<<s2<<"\n\n";
}
/*
*将某字符添加到某字符串的某个位置的结果写入文件
*/
void write_set(char s1[15],char s2[15],int index,char one_letter)
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
out<<s1<<"在"<<index<<"位置添加"<<one_letter<<"后 : "<<s2<<"\n\n";
}
/*
*将字符串翻转后写入文件
*/
void write_reverse_str(char s1[15],char s2[15])
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
out<<s1<<"通过字符串翻转 : "<<s2<<"\n\n";
}
/*
*起始写入文件的字符串
*/
void write_initvalue(int n)
{
ofstream out;
int i=0;
out.open("d:\\j33.txt",ios::out);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
cin.ignore(1);
while(i<n)
{
char s1[20];
cout<<"input "<<i+1<<" string :";
cin.getline(s1,15);
out<<s1<<"\n";
i++;
}
out<<"\n";
out.close();
}
/*
*读取文件指定位置的字符串
*/
char * read(int count)
{
ifstream in; //从文件读取数据
in.open("d:\\j33.txt",ios::in); //以读的方式打开
if(!in){
cout<<"文件打开失败!"<<endl;
return NULL;
}
while(count){
in.getline(s,15); //从第一行开始,读到第count次,读到count行
count--;
}
in.close();//关闭流
return s;
}
/*
*修饰作用(横线)
*/
void decorate()
{
ofstream out;
out.open("d:\\j33.txt",ios::out|ios::ate|ios::app);
if(!out)
{
cout<<"文件打开失败!"<<endl;
}
for(int i = 0;i < 40;i++){
cout<<"-";
out<<"-";
}
out<<"\n\n";
}
/*
*测试
*/
int main()
{
int m; //选择第几行字符串来使用的变量
int k; //选择操作数变量
int j=1; //判断用户是否选择退出
int MAX; //含有多少个字符串
int pos; //indexOf获取某字符在字符串的第一次出现的位置
char *strback; //获取操作结果的字符串
int compare_string_value; //字符串比较所返回的值
int find_string_value; //是否匹配查找字符串成功标志域
char *letter; //查找子串时作为子串
char index; //查找字符在string第一次出现位置的字符变量
int flag = 0; //字符串比较时的标志域
cout<<"您将在文件中输入几行字符串:";
cin>>MAX;
cout<<"\n请输入字符串: \n";
write_initvalue(MAX);
decorate();
cout<<"\n";
cout<<"1————字符串复制\n\n";
cout<<"2————字符串连接\n\n";
cout<<"3————字符串比较\n\n";
cout<<"4————字符串求子串\n\n";
cout<<"5————字符串交换\n\n";
cout<<"6————查找指定的字符串\n\n";
cout<<"7————查找某字符在字符串第一次出现的位置\n\n";
cout<<"8————将字符串所有字符都转换为大写\n\n";
cout<<"9————将字符串所有字符都转换为小写\n\n";
cout<<"10———消除字符串中的空格\n\n";
cout<<"11———消除字符串中常用标点符号\n\n";
cout<<"12———将字符添加到字符串的指定位置\n\n";
cout<<"13———字符串翻转\n\n";
cout<<"0————退出\n\n";
cout<<"请输入一个整型m,选择你此时将使用第几行字符串: ";
while(cin>>m){
if(m<=0||m>MAX){
cout<<"\n输入的m不在指定范围内,请重新输入:";
continue;
}
break;
}
String str_ing(read(m),12); //创建str_ing对象
char *temp = new char[strlen(str_ing.getStr())+1];//用于交换的临时字符指针
cout<<"此时的string为 : "<<str_ing.getStr()<<"\n\n";
cout<<"请选择操作号 : ";
while(j!=0&&cin>>k){
switch(k){
case 1:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n请输入你将选择第几行字符串复制给string : ";
cin>>m;
strback = str_ing.Strcpy(read(m));
write_copy(strback);
cout<<"\n复制完成后的string :";
cout<<strback <<"\n";
decorate();
break;
case 2:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n输入m选择文件中第几个字符串连接 : ";
cin>>m;
strback = str_ing.Strcat(read(m));
write_connect(strback);
cout<<"\n连接后的字符串:"<<strback<<endl;
decorate();
break;
case 3:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n输入m选择文件中第几个字符串进行比较 : ";
cin>>m;
compare_string_value = str_ing.Compare(read(m));
write_compare(str_ing.getStr(),read(m),compare_string_value);
decorate();
break;
case 4:
int sub_start,sub_end;
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n请输入需要取子串的起始与结束位置 : ";
cin>>sub_start>>sub_end;
cout<<"所求子串为: ";
strback = str_ing.substring(sub_start,sub_end);
write_substring(strback,str_ing.getStr(),sub_start,sub_end);
cout<<strback<<endl;
decorate();
break;
case 5:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n输入m选择文件中第几个字符串进行交换 : ";
cin>>m;
strcpy(temp,str_ing.getStr());
write_exchange(str_ing.getStr(),read(m),0);
str_ing.exchange(read(m)) ;
write_exchange(str_ing.getStr(),temp,1);
decorate();
break;
case 6:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n请输入要查找的子串 : ";
cin>>letter;
find_string_value = str_ing.BF_Find_String(letter);
write_BF_Find_String(str_ing.getStr(),letter,find_string_value);
decorate();
break;
case 7:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n请输入你要找的字符 : ";
cin>>index;
pos = str_ing.indexOf(index);
if(pos){
cout<<index<<"在"<<str_ing.getStr()<<"中第一次出现的位置在 : "<<pos<<"\n";
}else{
cout<<index<<"没有在string中找到\n";
}
write_indexOf(str_ing.getStr(),index,pos);
decorate();
break;
case 8:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
strcpy(temp,str_ing.getStr());
cout<<str_ing.getStr()<<"\n转换为大写后 : ";
str_ing.toUpperCase();
cout<<str_ing.getStr()<<"\n";
write_LowerAndUpperCase(temp,str_ing.getStr());
decorate();
break;
case 9:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
strcpy(temp,str_ing.getStr());
cout<<str_ing.getStr()<<"\n转换为小写后 : ";
str_ing.toLowerCase();
cout<<str_ing.getStr()<<"\n";
write_LowerAndUpperCase(temp,str_ing.getStr());
decorate();
break;
case 10:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
strback = str_ing.trim();
cout<<"\n消除空格后 :"<<strback<<"\n";
write_trim(str_ing.getStr(),strback);
decorate();
break;
case 11:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
strback = str_ing.SplitStr();
cout<<"\n消除标点符号后:"<<strback<<"\n";
write_SplitStr(str_ing.getStr(),strback);
decorate();
break;
case 12:
int index;
char one_letter;
strback = str_ing.getStr();
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
cout<<"\n请输入插入的位置和字符 : ";
cin>>index>>one_letter;
while(1){
if(index >= 0 && index < strlen(str_ing.getStr())){
break;
}
cout<<"输入范围有误,请重新输入(0-"<<strlen(str_ing.getStr())-1<<"):\n";
cin>>index>>one_letter;
}
str_ing.set(index,one_letter);
cout<<str_ing.getStr()<<"\n";
write_set(strback,str_ing.getStr(),index,one_letter);
decorate();
break;
case 13:
cout<<"此时你的操作字符串为"<<str_ing.getStr()<<"\n";
strback = str_ing.reverse_str();
cout<<"\n字符串翻转的结果 : "<<strback<<"\n";
write_reverse_str(str_ing.getStr(),strback);
decorate();
break;
case 0:
j=0;
cout<<"Thanks,bye\n";
break;
}
if(j){
cout<<"\n\n请选择操作号 : ";
}
}
return 0;
}
五、控制台操作界面
1、目录
![这里写图片描述](https://img-blog.csdn.net/20180526201548414?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfbGludXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
2、部分操作演示
![这里写图片描述](https://img-blog.csdn.net/20180526201615583?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfbGludXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
3、写入文件
![这里写图片描述](https://img-blog.csdn.net/20180526201638420?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfbGludXg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
工程下载—github
工程下载—CSDN下载