字符串流与文件操作——(学习笔记)

文章讲述了C++中使用stringstream进行字符串操作,涉及数据转换、字符串分割,并展示了文件操作如写入字符串、结构体数据和二进制格式的实例。
摘要由CSDN通过智能技术生成

🚘正片开始

字符串流

字符串流需要包含 头文件#include<sstream> ,字符串流可以做到

  1. 字符串数据的转换
  2. 字符串的分割

头文件:#include<sstream>

void main()
{
	stringstream object("我是大帅比"); //用此类创建对象并赋值
	cout << object.str();		//输出我是大帅比 返回的是string类的对象
	//下面两种输出我是大帅比,返回的是const char*类型
	const char* s=	object.str().data(); 
	const char* s=	object.str().c_str();
}

清空对象内部的字符串

void main()
{
	stringstream object("我是大帅比");
	cout << object.str(); //这里打印我是大帅比
	object.str("");  //这里清空
	cout << object.str(); //这里啥都不打印
}
1.1 数据转换成字符串

void main()
{
	stringstream stream;
	int num = 123456;
	char str[20] = { 0 };
	
	stream << num; //将数字输入到对象内
	stream >> str; //再由对象输到str数组
	cout << str;	//打印字符串123456
}

1.2 字符串转换成数据
void main()
{
	char str[25] = "3.14";
	stringstream stream(str);
	double num;
	stream >> num; //将字符串3.14输入到num
	cout << num;  //打印3.14

}
2. 字符串分割
int main()
{
	string str = "姓名: 张三 年龄: 18 性别: 男";
	stringstream stream(str);
	string tmp;
	char name[25] = { 0 };
	int age=0;
	char sex[25] = {0};
	stream >> tmp >> name >> tmp >> age >> tmp >> sex;
	cout << name << " " << age << " " << sex << endl; //张三 18 男
	return 0;
}

文件操作

了解相关的文件操作的函数

  1. 对象.get():每次获取文件的单个字符并返回其ASCLL码值
  2. 对象.getline():每次获取文件中一行字符并且忽略换行符
  3. 对象.put():每次写入文件一个字符
  4. 对象.eof():判断是否到达文件结束标志,没有到则返回0,到了则返回-1,此函数一般与上面三个函数结合使用
  5. 对象.is_open():此函数可以判断文件是否打开失败,打开失败返回0,成功返回非0
  6. 对象.fail():如果打开失败返回非0,成功返回0

问:

  1. 如何将字符串写到文件中,又如何将文件的字符串读到程序中?
  2. 如何将带有格式的数据写到文件中,又如何读出来?
  3. 如何使用二进制读写?

👇接下来我会逐个解答

✍将字符串写到文件中

	fstream out("string.txt", ios::out);
	if (!out.is_open())
	{
		printf("写的方式打开失败");
		return;
	}
	string name = "abcd\nefghd\nqqqqq";
	for (auto c : name)
	{
		out.put(c); //put()只能传字符
	}
	out.close();

📖将字符串读出来有两种方式

  1. 用对象访问get()函数读取
	fstream i("string.txt", ios::in);
	if (!i) //判断文件是否打开失败 如果打开失败i返回0    
	{
		printf("读的方式打开失败\n");
		return;
	}
	//开始读取
	while (!i.eof()) //判断是否达到文件结束标志
	{
		char c = i.get();
		cout <<c;
	}
	i.close();
  1. 用对象访问getline()函数读取
/*
string.txt内部数据
abcd
efgh
defr
*/

fstream read("string.txt", ios::in);
if (!read) //判断文件是否打开失败 如果打开失败i返回0    
{
	printf("读的方式打开失败\n");
	return;
}
//开始读取
char arr[255] = { 0 }; //读出来放到这里
while (!read.eof()) //判断是否达到文件结束标志
{
	read.getline(arr, 255);
	cout << arr;
}
//最终输出的结果是abcdefghdefr,很明显getline()忽略了换行符
read.close();

✍将有格式的数据写到文件中

用流的方式写入

struct Player
{
	char name[25];
	char sex[25];
	int age;
	char pos[25];
};

	Player Info[3] = { {"张三","男",18,"天津"},{"李四","男",20,"北京"},{"王五","男",22,"四川"} };
fstream out("info.txt", ios::out);
if (!out)
{
	printf("写的方式打开文件失败\n");
	return;
}
for (auto v : Info)
{
	out << v.name << "\t" << v.sex << "\t" << v.age << "\t" << v.pos << endl;
}
	out.close(); //关闭文件

📖将文件的数据读出

用流的方式流出

struct Player
{
	char name[25];
	char sex[25];
	int age;
	char pos[25];
};

//读
fstream i("info.txt", ios::in);
if (!i)
{
	printf("读的方式打开文件失败\n");
	return;
}
Player data[3] = { 0 };
for (auto& v : data)
{
	i >> v.name >> v.sex >> v.age >> v.pos;
}
i.close();

✍用二进制的方式写入

struct Player
{
	char name[25];
	char sex[25];
	int age;
	char pos[25];
};

Player Info[3] = { {"张三","男",18,"天津"},{"李四","男",20,"北京"},{"王五","男",22,"四川"} };
fstream out("info.txt", ios::out|ios::binary); //用二进制的方式需要加入二进制模式ios::binary
if (!out)
{
	printf("写的方式打开文件失败\n");
	return;
}
out.write((char*)Info, sizeof(Info));

out.close()

📖用二进制的方式读出

fstream i("info.txt", ios::in|ios::binary);
if (!i)
{
	printf("读的方式打开文件失败\n");
	return;
}
Player data[3] = { 0 };
i.read((char*)data, sizeof(data));

i.close();

🎉完结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值