实验六
1.追加
1 #include<iostream> 2 #include<fstream> 3 #include<string> 4 using namespace std; 5 #include<cstdlib> 6 7 int main() { 8 string filename3 = "3.txt"; 9 ofstream fout; 10 11 fout.open(filename3, ios_base::app); 12 if (!fout.is_open()) { 13 cerr << "fail to open file " << filename3 << endl; 14 system("pause"); 15 exit(0); 16 } 17 18 fout << endl << "merge successfully."; 19 fout.close(); 20 return 0; 21 }
2.
1 #include <iostream> 2 #include <string> 3 #include "utils.h" 4 #include<cstdlib> 5 using namespace std; 6 #include<fstream> 7 #include<vector> 8 #include<ctime> 9 /*1. 已知名单列表文件list.txt。 10 编写一个应用程序,实现从名单中随机抽点n位同学(n由键盘输入), 11 在屏幕上显示结果,同时也将结果写入文本文件,文件名自动读取当天系统日期, 12 如20190611.txt。*/ 13 int main() { 14 15 int n; 16 int num = 0;//记录总人数 17 string filename, filename1; 18 string cun[100];//用于存储学生信息,并且编号 19 int jilu[100];//用于判断是否已经被读过 20 21 //初始化 22 for (int i = 0; i < 100; i++) { 23 jilu[i] = 0; 24 } 25 26 filename = getCurrentDate(); 27 28 cout << "输入名单列表文件名:"; 29 cin >> filename1; 30 cout << "输入随机抽点人数:"; 31 cin >> n; 32 cout << "随机抽点中..." << endl; 33 filename = filename + ".txt"; 34 35 //输入文件流对象 36 fstream fin(filename1); 37 38 // 如果打开文件失败,则输出错误提示信息并退出 39 if (!fin) { 40 cerr << "fail to open file " << filename1 << endl; 41 system("pause"); 42 exit(0); 43 } 44 45 //输出文件流对象 46 ofstream fout(filename); 47 48 // 如果打开文件失败,则输出错误提示信息并退出 49 if (!fout) { 50 cerr << "fail to open file " << filename << endl; 51 system("pause"); 52 exit(0); 53 } 54 vector<string>aa; 55 string a; 56 while (getline(fin, a)) { 57 num++; 58 aa.push_back(a); 59 } 60 61 srand(time(0)); 62 for (int i = 1; i <= n;) { 63 int k = rand() % num; 64 if (jilu[k] != 1) { 65 cout << aa[k] << endl; 66 fout << aa[k] << endl; 67 i++; 68 jilu[k] = 1; 69 } 70 } 71 72 73 74 return 0; 75 }
3.
1 #include<iostream> 2 using namespace std; 3 #include<vector> 4 #include<string> 5 #include<fstream> 6 int tongji(string); 7 8 int main() { 9 int numc = 0, nums = 0, numw;//分别是字符,字符串,单词个数 10 fstream fin; 11 fin.open("D:\\c++老师编程\\c++实验\\实验六\\article.txt"); 12 if (!fin) { 13 cout << "fail to open!" << endl; 14 return 1; 15 } 16 17 char a; 18 while (fin.get(a)) { 19 numc++; 20 } 21 22 fin.close(); 23 fin.open("D:\\c++老师编程\\c++实验\\实验六\\article.txt"); 24 if (!fin) { 25 cout << "fail to open!" << endl; 26 return 1; 27 } 28 29 vector<string>word; 30 string aa; 31 while (getline(fin, aa)) { 32 word.push_back(aa); 33 nums++; 34 } 35 36 for (int i = 0; i < nums; i++) { 37 numw = numw + tongji(word[i]); 38 } 39 40 cout << "选择要统计的数:1--统计字符数, 2--统计行数 ,3--统计单词数"; 41 cout << ",4--统计字符行数 ,5--统计字符 单词,6--统计行数 单词数,7--统计字符 行数 单词数" << endl; 42 int t; 43 cin >> t; 44 if (t == 1) { 45 cout << "字符数:" << numc - nums + 1 << endl; 46 } 47 else if (t == 2) { 48 cout << "行数:" << nums << endl; 49 } 50 else if (t == 3) { 51 cout << "单词数:" << numw << endl; 52 } 53 else if (t == 4) { 54 cout << "单词数:" << numc - nums + 1 << " 行数:" << nums << endl; 55 } 56 else if (t == 5) { 57 cout << "字符数:" << numc - nums + 1 << " 单词数:" << numw << endl; 58 } 59 else if (t == 6) { 60 cout << "行数:" << nums << " 单词数:" << numw << endl; 61 } 62 else if (t == 7) { 63 cout << "字符数:" << numc - nums + 1 << " 行数: " << nums << " 单词数:" << numw << endl; 64 } 65 return 0; 66 } 67 68 int tongji(string a) { 69 70 int k = 1, num = 0; 71 for (int i = 0; i < a.size(); i++) { 72 if (a[i] == ' ') 73 k = 1; 74 else { 75 if (k == 1) { 76 num++; 77 k = 0; 78 } 79 } 80 } 81 return num; 82 }
与老师交谈后,发现程序中统计单词数目的做法可以更加精进一点。过程如下。(但是此做法在博物馆类似情况下就不太适用了)
1 #include<iostream> 2 using namespace std; 3 #include<vector> 4 #include<string> 5 #include<fstream> 6 int tongji(string); 7 8 int main(){ 9 int numc=0,nums=0,numw=0;//分别是字符,字符串,单词个数 10 fstream fin; 11 fin.open("D:\\c++老师编程\\c++实验\\实验六\\article.txt"); 12 if(!fin){ 13 cout<<"fail to open!"<<endl; 14 return 1; 15 } 16 17 char a; 18 while(fin.get(a)){ 19 numc++; 20 } 21 22 fin.close(); 23 fin.open("D:\\c++老师编程\\c++实验\\实验六\\article.txt"); 24 if(!fin){ 25 cout<<"fail to open!"<<endl; 26 return 1; 27 } 28 29 string aa; 30 while(getline(fin,aa)){ 31 nums++; 32 } 33 34 fin.close(); 35 fin.open("D:\\c++老师编程\\c++实验\\实验六\\article.txt"); 36 string b; 37 while(fin>>b){ 38 numw++; 39 } 40 41 42 43 cout<<"选择要统计的数:1--统计字符数, 2--统计行数 ,3--统计单词数"; 44 cout<<",4--统计字符行数 ,5--统计字符 单词,6--统计行数 单词数,7--统计字符 行数 单词数"<<endl; 45 int t; 46 cin>>t; 47 if(t==1){ 48 cout<<"字符数:"<<numc-nums+1<<endl; 49 } 50 else if(t==2){ 51 cout<<"行数:"<<nums<<endl; 52 } 53 else if (t==3){ 54 cout<<"单词数:"<<numw<<endl; 55 } 56 else if(t==4){ 57 cout<<"单词数:"<<numc-nums+1<<" 行数:"<<nums<<endl; 58 } 59 else if(t==5){ 60 cout<<"字符数:"<<numc-nums+1<<" 单词数:"<<numw<<endl; 61 } 62 else if(t==6){ 63 cout<<"行数:"<<nums<<" 单词数:"<<numw<<endl; 64 } 65 else if(t==7){ 66 cout<<"字符数:"<<numc-nums+1<<" 行数: "<<nums<<" 单词数:"<<numw<<endl; 67 } 68 return 0; 69 }
实验过程中会踩的坑:在第三个中,统计字符个数时,一开始运行结果比实际多了两个,后来我察觉到时因为换行符的问题。
还有在统计单词个数的时候,for(int i=0 ;i<a.size();i++)这一句中间我一开始定义的是a[i]!=‘\0’;这很明显是错误的 。
https://www.cnblogs.com/lyc1103/
https://www.cnblogs.com/qiuxiuh/
https://www.cnblogs.com/cjj1/