C++读写文件

一、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;
}

2、运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值