C++文件读写

前言

  • < ifstream> 读取文件的内容
  • < ofstream> 用于创建文件并向文件中写入内容
  • < fstream > 同时具有ofstream和ifstream两种功能

读写文件基础操作

写文件

	//1包含头文件
#include<iostream>
#include<ofstream>
using namespace std;
int main()
{
	//创建对象
	ofstream ofs;
	//以写入和追加到文件末尾方式打开文件
	ofs.open("file.text",ios::out|ios::app);

	//判断文件是否成功打开了
	if (!ofs.is_open())
	{
		cout << "文件打开失败" << endl;
		ofs.close();
		exit(-1);
	}

	//写入文件
	ofs << " 11111 15";
	//关闭
	ofs.close();
}

读文件

#include<iostream>
#include<ifstream>
using namespace std;
int main()
{
	string file;
	cout<<"请输入文件名"<<endl;
	cin>>file;
	
	ifstream ifs(file.c_str(),ios::in);//读操作

	if (!ifs.is_open())
	{
		cerr << "文件打开失败" << endl;
		ifs.close();
		exit(-1);
	}


	char buffer[1024] = { 0 };
	int n;//计数
//读取文件时,但读到文件末尾时,ifs>>buffer条件会为假
//碰到空格时,while循环会执行一次并将多到的数据存到buffer中。
	while (ifs >> buffer)
	{
		n++;
		cout << buffer << endl;
	}
	cout<<"循环执行"<<n<<"次"<<endl;
	ifs.close();
}
  • 注意:上面写文件的创建对象和打开文件可以像读文
    件那样合并到一起,两者的效果等效。如:
    ofstreamofs(“file.text”,ios::out|ios::app);
  • open()函数有两个重载,原型为:
    void open( const char *filename );
    void open( const char *filename, openmode mode );
    注意:filename类型为c风格字符串,如果使用string请注意使用file.c_str()将其转为c风格。

openmode

  • ios::in 为读取打开文件

  • ios::out 为写入打开文件

  • ios::trunc 覆盖原来已经存在的文件(具有写属性)
    当文件已经存在了,进行写文件时,将删除原来所有内容从新进行写数据。 注意,此项只能用于写文件中,用于读文件会导致文件打不开,或读出空数据。

  • ios::app 在文件末尾添加数据,不会覆盖原来的数据

  • ios::ate 当已打开时寻找到EOF(文件末尾)在写文件时,会清空原来的数据,在读文件时会定位到文件末尾,导致读出数据为空

  • ios::binary 以二进制模式打开文件

openmode的组合有许多,篇幅问题就不一一介绍了,感兴趣的小伙伴可以自己动手实践实践,可以加深自己的动手能力,毕竟自己动手总结的要远比别人总结后告诉你要更有成就感。
在这里插入图片描述

你也可以像示例那样可以使用|将多个openmode连接到一起使用。但要注意:有冲突的openmode一起使用会导致文件打开出错 如:ios::app|ios::trunc.

晋级操作

随机读文件

#include<iostream>
#include<ifstream>
using namespace std;

int main()
{
	ifstream ifs("file.text", ios::in | ios::binary);//读操作

	if (!ifs.is_open())
	{
		cerr << "文件打开3失败" << endl;
		ifs.close();
		exit(-1);
	}


	char buffer[1024] = { 0 };

	//获取当前指针位置
	streampos pos = ifs.tellg();
	cout << pos << endl;
	//定位到指定位置
	ifs.seekg(3,ios::cur);

	//将数据从指定位置读到buffer中,对应的写有write()
	ifs.read(buffer, sizeof(buffer));
	cout << buffer << endl;
	ifs.close();
}
  • 函数read()用于输入流,在将字符放入buffer 之前从流中读取num 个字节。如果碰到EOF,read()中止。第一个参数必须要转换为char*才可以。
  • tellg()函数用于输入流,并返回流中"get"指针的当前位置。注意返回的类型为streampos。
  • 函数seekg()用于输入流,并且它将重新设置"get"指针到当前流的从origin偏移offset个字节的位置上,或是置"get"指针在position位置。 它有两重载函数,依次对应上面两种情况
    istream &seekg( off_type offset, ios::seekdir origin );
    istream &seekg( pos_type position );

ios::seekdir有三种取值分别为:

  • ios::cur 表示输入/输出流当前的位置。
    ios::beg 表示输入/输出流开始的位置。
    ios::end 表示输入/输出流结束的位置。

第一个参数是偏移量,整数表示向后偏移,负数表示向前偏移。

随机写文件

输入流操作:seekg()和tellg()。
输出流操作: seekp()和tellp()。
他们相互对应的,基本操作也都一样,唯一不同的是,一个用于输入流一个用于输出流。因此便不详细说明了,给大家留个例子仅供参考。

#include<iostream>
#include<ofstream>
using namespace std;

int mian()
{
	//1包含头文件
	//创建对象
	ofstream ofs;
	//打开方式
	ofs.open("file.text", ios::out | ios::binary );

	//判断文件是否成功打开了
	if (!ofs.is_open())
	{
		cerr << "文件打开失败" << endl;
		exit(-1);
	}

	//获取当前指针位置
	streampos pos=ofs.tellp();

	//从当前指针位置开始写
	//ofs.seekp(pos);

	//从开始位置往后移动三下的位置开始写数据,
	//会清空原来的数据
	ofs.seekp(3, ios::beg);
	写入文件
	ofs << " 11111 15";
	//关闭
	ofs.close();
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值