您的位置:首页 > 编程语言 > C语言/C++

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. 打开文件

打开文件有两种方式:

方式一:

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~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: