P1
合并两个文件到新文件中。文件名均从键盘输入。
运行程序ex1.cpp,结合运行结果及源码中注释,理解和体会文件I/O的方法
1 // 合并两个文件内容到一个新文件中。 2 // 文件名均从键盘输入 3 4 #include <iostream> 5 #include <fstream> 6 #include <string> 7 #include <cstdlib> 8 using namespace std; 9 10 int main() { 11 string filename1, filename2, newfilename; 12 13 cout << "输入要合并的两个文件名: " ; 14 cin >> filename1 >> filename2; 15 cout << "输入合并后新文件名: " ; 16 cin >> newfilename; 17 18 ofstream fout; // 输出文件流对象 19 ifstream fin; // 输入文件流对象 20 21 22 fin.open(filename1); // 将输入文件流对象fin与文件filename1建立关联 23 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出 24 cerr << "fail to open file " << filename1 << endl; 25 system("pause"); 26 exit(0); 27 } 28 29 fout.open(newfilename); // 将输出文件流对象fout与文件newfilename建立关联 30 if(!fin.is_open()) { // 如果创建/打开文件失败,输出错误提示信息并退出 31 cerr << "fail to open file " << newfilename << endl; 32 system("pause"); 33 exit(0); 34 } 35 36 char ch; 37 38 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中 39 while(fin.get(ch)) 40 fout << ch; 41 42 fin.close(); // 关闭文件输入流对象fin与文件filename1的关联 43 44 fout << endl; // 向文件输出流对象fout中插入换行 45 46 47 fin.open(filename2); // 将输入文件流对象fin与文件filename2建立关联 48 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出 49 cerr << "fail to open file " << filename2 << endl; 50 system("pause"); 51 exit(0); 52 } 53 54 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中 55 while(fin.get(ch)) 56 fout << ch; 57 58 fin.close(); // 关闭文件输入流对象fin与文件filename2的关联 59 fout.close(); // 关闭文件输出流对象fout与文件newfilename的关联 60 61 system("pause"); 62 63 return 0; 64 }
P2
使用文件I/O流,以文本方式打开Part1中合并后的文件,在文件最后一行添加字符"merge successfully."
1 // 合并两个文件内容到一个新文件中。 2 // 文件名均从键盘输入 3 4 #include <iostream> 5 #include <fstream> 6 #include <string> 7 #include <cstdlib> 8 using namespace std; 9 10 int main() { 11 string filename1, filename2, newfilename; 12 13 cout << "输入要合并的两个文件名: " ; 14 cin >> filename1 >> filename2; 15 cout << "输入合并后新文件名: " ; 16 cin >> newfilename; 17 18 ofstream fout; // 输出文件流对象 19 ifstream fin; // 输入文件流对象 20 21 22 fin.open(filename1); // 将输入文件流对象fin与文件filename1建立关联 23 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出 24 cerr << "fail to open file " << filename1 << endl; 25 system("pause"); 26 exit(0); 27 } 28 29 fout.open(newfilename); // 将输出文件流对象fout与文件newfilename建立关联 30 if(!fin.is_open()) { // 如果创建/打开文件失败,输出错误提示信息并退出 31 cerr << "fail to open file " << newfilename << endl; 32 system("pause"); 33 exit(0); 34 } 35 36 char ch; 37 38 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中 39 while(fin.get(ch)) 40 fout << ch; 41 42 fin.close(); // 关闭文件输入流对象fin与文件filename1的关联 43 44 fout << endl; // 向文件输出流对象fout中插入换行 45 46 47 fin.open(filename2); // 将输入文件流对象fin与文件filename2建立关联 48 if(!fin.is_open()) { // 如果打开文件失败,则输出错误提示信息并退出 49 cerr << "fail to open file " << filename2 << endl; 50 system("pause"); 51 exit(0); 52 } 53 54 // 从文件输入流对象fin中获取字符,并将其插入到文件输出流对象fout中 55 while(fin.get(ch)) 56 fout << ch; 57 58 fin.close(); // 关闭文件输入流对象fin与文件filename2的关联 59 fout.close(); // 关闭文件输出流对象fout与文件newfilename的关联 60 61 system("pause"); 62 63 fout.open(newfilename,ios_base::app); 64 fout << endl << "merge successfully. " << endl; 65 fout.close(); 66 67 return 0; 68 }
P3
已知名单列表文件list.txt。编写一个应用程序,实现从名单中随机抽点n位同学(n由键盘输入),在屏幕上显 示结果,同时也将结果写入文本文件,文件名自动读取当天系统日期,如20190611.txt。
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include <cstdlib> 5 #include <ctime> 6 #include "utils.h" 7 8 using namespace std; 9 10 int main() { 11 string listname; 12 string filename; 13 string s[100],t; 14 int num,i,j,k,a; 15 16 ofstream fout; 17 ifstream fin; 18 19 filename = getCurrentDate()+".txt"; 20 21 cout << "输入名单列表文件名:"; 22 cin >> listname; 23 cout << "输入随机抽点人数:"; 24 cin >> num; 25 26 cout << "随机抽点中..." << endl; 27 28 fin.open (listname,ios_base::in); 29 fout.open (filename,ios_base::app); 30 31 j = 0; 32 33 while (getline (fin,t)) { 34 s[j++] = t; 35 } 36 37 fin.close(); 38 39 srand (time (0)); 40 for (i=0;i<num;i++) { 41 k=rand()%j; 42 cout << s[k] << endl; 43 fout << s[k] << endl; 44 for (a = k; a < j - 1; a++) 45 s[a] = s[a + 1]; 46 j--; 47 } 48 49 cout << filename << endl; 50 51 system("pause"); 52 53 return 0; 54 } 55
P4
编程统计英文文本文件中字符数(包括空格)、单词数、行数。文件名由键盘输入。
1 #include <iostream> 2 #include <fstream> 3 #include <string> 4 #include <cstdlib> 5 6 using namespace std; 7 8 int main() { 9 string filename; 10 11 ifstream fin; 12 13 int i=0,j=0,k=0; 14 char ch; 15 string chs; 16 17 cout << "请输入文件名:"; 18 cin >> filename; 19 20 fin.open(filename); 21 22 while (fin.get(ch)) 23 if (ch != '\n') 24 i++; 25 26 cout << "字符数:" << i << endl; 27 28 fin.close(); 29 30 fin.open(filename); 31 32 while (fin.get(ch)) 33 if (ch >= 'A'&&ch <= 'z') { 34 j++; 35 while (ch >= 'A'&&ch <= 'z') 36 fin.get(ch); 37 } 38 39 cout << "单词数:" << j << endl; 40 41 fin.close(); 42 43 fin.open(filename); 44 45 while (getline(fin, chs)) 46 k++; 47 48 cout << "行数:" << k << endl; 49 50 fin.close(); 51 }
总结与体会
这次的实验真的让我做的很难受,当你面对一道题目你无从下手的时候的那种无力感真的让人很不舒服。最后一点一点的磨,在课上也做出了一半多点。在做P3的时候关于如何输出是想的最难受的地方,在我想要放弃决定去问下老师的时候,我想到了一些东西,比如要先定位再输出,然后就回去尝试了。当然结果并不好,关于seekg和tellg的应用真的束手无策,看那些已经交了作业的同学的做法,发现把文件里的东西存为数组再输出会相对容易一点。最后一次实验了,发现自己真面对题目的时候有好多问题,不仅要花的时间长,而且很难有成果做出来。
喊了一个学期的努力了,喊累了,又不想就这样草草的结束,但也不知道自己今后能否做出一点点的改变,无论在学习上,还是生活上......