第七篇:两个经典的文件IO程序示例
前言
本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅。
程序功能
程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据。
程序一代码及其注释
1 #include <iostream> 2 #include <fstream> // 使用文件处理对象记着要包含这个头文件 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7 8 int main() 9 { 10 /* 11 * 获取用户需要打开的所有文件名,将其保存在顺序容器files中。 12 */ 13 string filename; 14 vector<string> files; 15 cout << "请输入要处理的文本文件名( ctrl+d结束 ):" << endl; 16 while (cin >> filename) { 17 files.push_back(filename); 18 cout << "请输入要处理的文本文件名( ctrl+d结束 ):" << endl; 19 } 20 cout << endl << "文件名录入完毕..." << endl << endl; 21 22 /* 23 * 遍历文件名,并输出各个文件。 24 */ 25 // 创建一个流对象 26 fstream io; 27 for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { 28 // 打开文件 29 io.open(it->c_str()); 30 // 打开文件失败的异常处理 31 if (!io) { 32 cout << "文件 " << it->c_str() << " 打开失败!" << endl; 33 continue; 34 } 35 /* 36 * 打印文件内容 37 */ 38 cout << "文件: " << it->c_str() << endl; 39 string s; 40 while (getline(io, s)) 41 cout << s << endl; 42 cout << endl << "文件" << it->c_str() << "读取完毕" << endl << endl << endl; 43 // 重置流前要先关闭流 44 io.close(); 45 // 重置流 46 io.clear(); 47 } 48 49 // 使用完流关闭流。 50 io.close(); 51 52 return 0; 53 }
自行上机体验,不在此运行演示。
程序二代码及其注释
1 #include <iostream> 2 #include <fstream> // 使用文件处理对象记着要包含这个头文件 3 #include <string> 4 #include <vector> 5 6 using namespace std; 7 8 int main() 9 { 10 /* 11 * 获取用户需要打开的所有文件名,将其保存在顺序容器files中。 12 */ 13 string filename; 14 vector<string> files; 15 cout << "请输入要处理的文本文件名( #结束 ):" << endl; 16 while (cin >> filename) { 17 if (filename=="#") break; 18 files.push_back(filename); 19 cout << "请输入要处理的文本文件名( #结束 ):" << endl; 20 } 21 // 清空输入缓冲区 22 cin.ignore(1024, '\n'); 23 cout << endl << "文件名录入完毕..." << endl << endl; 24 25 /* 26 * 遍历文件名,并依次往文件中写入数据。 27 */ 28 fstream io; 29 for (vector<string>::iterator it = files.begin(); it != files.end(); it++) { 30 // 打开文件 31 io.open(it->c_str()); 32 // 打开文件失败的异常处理 33 if (!io) { 34 cout << "文件 " << it->c_str() << " 打开失败!" << endl; 35 continue; 36 } 37 /* 38 * 往文件写入数据 39 */ 40 cout << "文件: " << it->c_str() << "( 单行输入#结束写入 )" << endl; 41 string s; 42 while (getline(cin, s)) { 43 if (s == "#") break; 44 io << s << endl; 45 } 46 cout << endl << "文件" << it->c_str() << "写入完毕" << endl << endl << endl; 47 // 重置流前要先关闭流 48 io.close(); 49 // 重置流 50 io.clear(); 51 } 52 53 // 使用完流关闭流 54 io.close(); 55 56 return 0; 57 }
自行上机体验,不在此运行演示。
说明
1. 我之所以选用的例子是处理多个文件而不是单个文件,是想在代码中体现出用单个流对象处理多个文件的技巧。
2. 文件IO操作还有许多功能,诸如控制打开模式,获得流状态等等。详情参考各C++教材。