一、C++的IO类
1、IO类的基本介绍
平常我们使用C++的IO操作大多都是操作char类型的数据,在默认情况下这些对象都是关联到用户的控制台窗口的。例如从键盘输入数据,然后赋值给某一个变量。但是实际的应用程序不仅仅是从控制台进行IO操作,通常还会读写命名文件,操作string类型中的字符等等。
为了支持不同种类型的IO处理操作,在常见的istream和ostream外,C++的标准库还定义了一些其他的IO类型。他们分别定义在三个头文件 中:iostream头文件用于定义读写流的基本类型,也是最常见的,用于从控制台读取数据;fstream头文件定义了读写命名文件的类型;sstream定义了读写内存string类型对象的类型。
头文件 | 头文件中定义的数据类型 |
iostream | istream,从流中读取数据,cin就是istream类型 ostream,向流中写入数据,cout就是ostream类型 iostream,读写流 |
fstream | ifstream,从文件中读取数据 ofstream,向文件中写入数据 fstream,读写文件 |
sstream | istringstream,从string对象中读取数据 ostringstream,向string对象中写入数据 stringstream,对象string对象 |
2、IO类型间的基本关系
一般在iostream头文件中定义的数据类型通常用于从控制台窗口来读写数据;定义在fstream头文件中的数据类型用于内存与磁盘文件的交互;sstream头文件中定义的数据用于读写一个string类型的对象。
二、文件的输入输出(读写)
虽然C++的IO操作有多种类型,但是在本本篇文章当中主要研究关于fstream头文件中定义的类,以此来实现对文件的读写操作。
头文件fstream中定义了三种数据类型来支持文件IO:ifstream,从一个给定的文件中读取数据;ofstream,向一个给定的文件中写入数据;fstream可以实现对文件的读写操作。这些类型所支持的操作和我们之前使用过的cin,cout的操作都是一样的,如<<、>>、getline等方法都可以使用。当然fstream头文件中定义的数据类型也有它们自己的一些特有操作:
fstream特有操作 | |
fstream file1; | 创建了一个未绑定文件的流,可以进行流的输入输出操作 |
fstream file1(s); | 创建了一个流,并且打开了名为s的文件,流与文件进行了绑定。 |
fstream file1(s, mode); | 按照指定格式打开文件s,并与创建的流进行绑定 |
file1.open(s); | 打开了一个名为s的文件,并将文件与流file1进行了绑定。 |
file1.close(s); | 关闭了与file绑定的文件s,返回void |
file1.is_open(); | 判断与流file1关联的文件是否打开,返回一个bool值 |
1、文件的打开模式
每一个流都有一个关联的文件模式,用来指出如何使用文件。如下表所示:
ios::in | 以只读的方式打开文件 |
ios::out | 以只写的方式打开文件 |
ios::app | 以追加的方式打开文件 |
ios::ate | 打开文件后,文件的读写标志定位在文件的末尾 |
ios::trunc | 清空文件的现有内容 |
ios::binary | 以二进制的方式进行IO操作 |
ios::nocreate | 如果文件不存在,则不创建 |
ios::noreplace | 如果文件不存在,则创建文件 |
2、文件的读写标志:
ios::beg 文件的开头
ios::end 文件的结尾
ios::cur 文件的当前位置
使用:
file.seekg(0, ios::beg); 将文件的读写位置定位在文件的开头
file.seekg(0, ios::end); 将文件的读写位置定位在文件的末尾
file.seekg(10, ios::cur); 将文件的读写位置定位在当前位置向后偏移10个字节
file.seekg(-10, ios::cur); 将文件的读写位置定位在当前位置向前偏移10个字节
file.seekg(10, ios::beg); 将文件的读写位置定位在流文件开头10字节的位置
三、实例:
1、源码:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
/*学生信息结构体*/
struct Stu {
int id;
string name;
string sex;
int age;
};
int main()
{
Stu stuArr[5];
ifstream srcFile("src.txt");/*ifstream流对象srcFile与文件src.txt进行绑定*/
ofstream outFile("out.txt");/*ofstream流对象outFile与文件out.txt进行绑定*/
if (!srcFile.is_open() || !outFile.is_open())
{
cout << "文件打开失败!" << endl;
return -1;
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 4; j++)
{
if (j == 0)
{
srcFile >> stuArr[i].id;/*从文件中读取数据,存放在结构体数组中*/
}
else if (j == 1)
{
srcFile >> stuArr[i].name;
}
else if (j == 2)
{
srcFile >> stuArr[i].sex;
}
else if (j == 3)
{
srcFile >> stuArr[i].age;
}
}
if (i == 0)
{
outFile << "学号" << '\t' << "姓名" << '\t' << '\t' << "性别" << '\t' << "年龄" << endl;
}
outFile << stuArr[i].id << '\t' << stuArr[i].name << '\t' << '\t' << stuArr[i].sex << '\t' << '\t' << stuArr[i].age << endl;
}
srcFile.close();
outFile.close();
return 0;
}