C++ Primer学习笔记(10)——如何读写文件
2015-07-05 10:27
686 查看
我们常接触的 cin cout是从控制窗口读写数据,往往是从键盘输入、显示到显示器上,是交互的方式之一。然而,通常还需要读或者写已命名的文件;以及访问内存中的数据。
那么C++如何读写文件?
常常要用到三个类:fstream, ifstream, ofstream ,这三类中定义了读写文件的基本操作。
先列出IO标准库提供的工具:
istream (输入流)类型,提供输入操作。
ostream (输出流)类型,提供输出操作。
cin ,读入标准输入的 istream 对象。
cout, 写到标准输出的 ostream 对象。
cerr , 输出标准错误的 ostream 对象, 常用于程序错误信息。
>> 操作符,从 istream 对象中读入数据。
<< 操作符,把输出写到 osteram 对象中。
getline(isteram& , string&) 函数,从istream 对象读取一行,写入string 对象中。
1. 打开文件
打开文件有两种方式:
方式一:
方式二:
写一个打开文件的函数:
2. 读取文件
写一个读文件内容的函数:
3. 实例
例1 打开给定的文件并读取其内容
假设上面的打开文件open_file() 函数 和 读取文件get()函数已写在 file.h 文件中,包含即可
例2 编写函数打开文件用于输入,将文件内容读入string 类型的vector容器,每一行 存储为该容器对象的一个元素
例3 把例2 改成要求把文件中每一个单词存储为 vector 中的一个元素,而不是一行。
很简单,只需要把 fileToVector 函数中的
改成
即可 O(∩_∩)O~
那么C++如何读写文件?
常常要用到三个类:fstream, ifstream, ofstream ,这三类中定义了读写文件的基本操作。
先列出IO标准库提供的工具:
istream (输入流)类型,提供输入操作。
ostream (输出流)类型,提供输出操作。
cin ,读入标准输入的 istream 对象。
cout, 写到标准输出的 ostream 对象。
cerr , 输出标准错误的 ostream 对象, 常用于程序错误信息。
>> 操作符,从 istream 对象中读入数据。
<< 操作符,把输出写到 osteram 对象中。
getline(isteram& , string&) 函数,从istream 对象读取一行,写入string 对象中。
1. 打开文件
打开文件有两种方式:
方式一:
ifstream in; //读取文件类,如果是写的话,用ofstream 即可 string fileName; // 文件名 in.open(fileName.c_str()); // 用类成员函数open()打开文件,其形参为文件名。c_str()函数是将string类的字符串转换成普通字符串。
方式二:
string fileName; ifstream in(fileName.c_str()); // 定义对象时直接关联文件名即可打开,这里是读文件,若是写文件,用ofstream 即可
写一个打开文件的函数:
ifstream& open_file(ifstream & in, string & fileName) { // 若文件已打开,先关闭,否则in 流尝试打开文件时会出错 in.close(); // 传入的实参in 流可能遗留某种状态,如文件结束符,必须先清除,否则下次读文件时始终是读文件结束 in.clear(); in.open(fileName.c_str()); // 返回流,供函数调用时判断是否正确读取使用 return in; }
2. 读取文件
写一个读文件内容的函数:
istream& get(istream& in) { int ival; // 假设存放的是数据 while(in >> ival , !in.eof()) {// 判断条件为一直读,直到文件结束符 if(in.bad()) throw runtime_error("系统故障!"); if(in.fail()) { cerr << "错误数据!"; in.clear(); // 清除流 in.ignore(200,' '); //跳过200个字符,跳过类型非法的字符或遇到空格为止 continue; // 继续读入数据 } cout << ival << " "; } in.clear(); return in; }
3. 实例
例1 打开给定的文件并读取其内容
假设上面的打开文件open_file() 函数 和 读取文件get()函数已写在 file.h 文件中,包含即可
#include <iostream> #include <string> #include <fstream> #include "file.h" using namespace std; int main() { string fileName; ifstream inFile; cout << "请输入要打开的文件名:" << endl; cin >> fileName; // 下面调用open_file函数打开文件 if(!open_file(inFile,fileName)) { cout << "error: 打开失败!!" <<endl; return -1; } // 下面调用get 函数读取文件 get(inFile); // 关闭文件 inFile.close(); return 0; }
例2 编写函数打开文件用于输入,将文件内容读入string 类型的vector容器,每一行 存储为该容器对象的一个元素
// 编写fileToVector()函数打开文件用于输入 // 可用getline()函数读一行 #include<iostream> #include<vector> #include<string> #include<fstream> using namespace std; /*******首先编写 fileToVector 函数*******/ int fileToVector(string& fileName, vector<string>& svec) { ifstream inFile(fileName.c_str()); if(!inFile) return 1; // 打开失败 // 将文件一行一行读到 vector 中 string s; // 临时变量,存放读出的行 while(getline(inFile,s)) svec.push_back(s); inFile.close(); // 给出以下返回值是用来标记错误的,函数调用时判断 if(inFile.bad()) return 2; // 系统错误标记 if(inFile.fail()) return 3; // 非法数据 if(inFile.eof()) return 4; // 结束标记 } /******************主函数******************/ int main() { string fileName; vector<string> svec; cout << "请输入文件名:" << endl; cin >> fileName; //处理文件,调用fileToVector,判断其返回值 switch(fileToVector(fileName,spec)){ case 1: cout << "打开文件失败!" << endl; return -1; // 注意:这里不能用break,应该直接异常结束程序;break 只能跳出switch !!! case 2: cout << "系统错误!" << endl; return -1; case 3: cout << "读取错误!" << endl; return -1; } // 输出 vector 对象进行检查 for(vector<string>::iterator iter = svec.begin(); iter != svec.end() ; ++iter) cout << *iter << endl; return 0; }
例3 把例2 改成要求把文件中每一个单词存储为 vector 中的一个元素,而不是一行。
很简单,只需要把 fileToVector 函数中的
while(getline(inFile,s))
改成
while(inFile >> s)
即可 O(∩_∩)O~
相关文章推荐
- 《C语言及程序设计》实践参考——链表的合并
- 《C语言及程序设计》实践项目——链表初步
- visual C++ 2003
- 《C语言及程序设计》程序阅读——链表初步
- c++ primer 学习笔记 3 变量与基本类型
- c++读书笔记——类的定义
- hdu2024C语言合法标识符
- C++Mfc中读出文件夹里面的相关文件
- 汇编学习-汇编指令与C语言
- C/C++中const的用法
- C/C++中const的用法
- C++对象内存布局 (一)
- Jenkins Smiple use
- 百家姓排序(C++)
- VC++实现生成右键菜单及添加图标
- c++学习-多态性
- 浙大PatC语言练习50-76
- PATC语言1-50
- [C/C++标准库]_[初级]_[使用fstream合并文本文件]
- [C/C++标准库]_[初级]_[使用fstream合并文本文件]