c++文件io,字符串io简单介绍

目录

c++文件io

介绍

采用文件流对象操作文件的一般步骤

示例

注意点

利用字节流特性  

字符串io

介绍

istringstream

ostringstream

示例


c++文件io

介绍

c++根据文件内容的数据格式分为二进制文件文本文件

  • 基本上和c一样

c++ 标准库中有许多不同的标志

  • 用于指定流对象的行为,可以组合在一起以设置不同的模式:

 

采用文件流对象操作文件的一般步骤

定义一个文件流对象

  • ifstream (只输入用) / ofstream(只输出用) / fstream(既输入又输出用)

使用文件流对象的成员函数打开一个磁盘文件

  • 使得文件流对象和磁盘文件之间建立联系
  • 使用提取和插入运算符对文件进行读写操作 / 使用成员函数进行读写

关闭文件

示例

#define _CRT_SECURE_NO_WARNINGS

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>

using namespace std;

struct info_data {
	char _data[50]; //不能使用string/vector
	int _port;
};

class information {
public:
	//ifstream& operator<<()
	information(const string& arr) //我们的文件操作首先需要一个文件路径
		:_filename(arr) {}

	void  b_read(info_data& info) {
		ifstream i(_filename, ios_base::in | ios_base::binary);//用二进制读方式打开
		i.read((char*)&info, sizeof(info));//将流中数据读入info中
		i.close();
	}
	void b_write(const info_data& info) {
		ofstream i(_filename, ios_base::out | ios_base::binary | ios_base::app);//用二进制追加写方式打开
		i.write((const char*)&info, sizeof(info));//将info写入流中
		i.write("\n", sizeof("\n"));
		i.close();
	}

	void t_read(info_data& info) {
		ifstream i(_filename);
		i >> info._data >> info._port;//将流中数据读入info中
		i.close();
	}
	void t_write(const info_data& info) {
		ofstream i(_filename, ios_base::out | ios_base::app);//追加方式
		i << info._data << " " << info._port << endl;
		//将info写入流中(可以在中间加入空格和换行符,这样存入文件中的数据更易懂)
		i.close();
	}
private:
	string _filename;
};

int main() {
	information t("test.txt");

	//文本方式读写
	info_data data;
	t.t_write({ "hello",80 });
	t.t_read(data);
	cout << "data: " << data._data << " " << data._port << endl;

	//二进制方式读写
	info_data tmp;
	t.b_write({ "hello",80 });
	t.b_read(tmp);
	cout << "tmp: " << tmp._data << " " << tmp._port << endl;

	return 0;
}

文件内容:

代码执行结果:

注意点

如果用string/vector存储数据(也就是字符串)

  • 一旦字符串长度有点长,就会在堆上开辟空间存放数据,只会存储一个地址指向那块空间,那存入文件的也是那个地址
  • 但下次程序执行,读取文件时,会读取到上次运行时生成的地址,在这次就是无效地址,越界访问了
  • 注意,打开文件之后,如果不需要它了, 最好显式关闭文件

 

利用字节流特性  

void test3() {
	ifstream i("code.cpp");
	char c;
	while (i.get(c)) {
		cout << c;
	}
}
  • 利用文件中存储的数据是字节流形式,可以通过get函数获取字符,然后把某个文件全部读出

 

字符串io

介绍

istringstream

  • 可以从一个字符串中提取数据
  • 也是一种反序列化的过程,通常包括从字节流中读取数据,解码数据并将其还原为原始数据结构的字段

ostringstream

  • 将数据格式化为字符串,可以像输出到标准输出流一样来构建字符串
  • 属于简单序列化的过程
  • 序列化过程通常包括将数据的字段按照一定的协议编码为字节流,并将其写入文件或通过网络发送
  • 最后通过str()成员函数来获取格式化后的字符串

示例

void test2() {
	int a = 1;
	double b = 1.1;
	ostringstream o;//格式化写入
	o << a << " " << b;
	string str = o.str();
	cout << str << endl;

	ofstream i("test.txt", ios_base::out | ios_base::app);//将字符串写入文件
	i << str << endl;
	i.close();
}
  • 文件内容:
  • 代码结果:
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值