C++文件读写

C++文件读写,第1张

C++文件读写

文章目录
  • 前言
  • 读写文件基础 *** 作
    • 写文件
    • 读文件
    • openmode
  • 晋级 *** 作
    • 随机读文件
    • 随机写文件

前言
  • < ifstream> 读取文件的内容
  • < ofstream> 用于创建文件并向文件中写入内容
  • < fstream > 同时具有ofstream和ifstream两种功能
读写文件基础 *** 作 写文件
	//1包含头文件
#include
#include
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
#include
using namespace std;
int main()
{
	string file;
	cout<<"请输入文件名"<>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<<"循环执行"< 
  • 注意:上面写文件的创建对象和打开文件可以像读文
    件那样合并到一起,两者的效果等效。如:
    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
#include
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
#include
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();
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4994899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存