c++文件操作(2)-- 按照指定格式读写文件

发布时间:2024年01月24日

目录

按照指定格式写文件

代码说明:??

按照指定格式读文件 -- 解析一定格式的字符串

代码说明:?

注意:?

问: 为什么使用getline()?


?

按照指定格式写文件

在实际开发中,我们以一定的格式写入文件当中。?

其实就是使用stringstream类对象来实现。

#include <iostream>
#include <stdlib.h>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;

int main(void) {

	ofstream io;
	stringstream ret;

	string name = "张三";
	int age = 18;

	io.open("data.txt");

	if (!io.is_open()) return 1;

	ret << "姓名: " << name << " 年龄:" << age << endl;

	io << ret.str();

	io.close();

	system("pause");

	return 0;
}

?

代码说明:??

大部分操作和写文件类似,只是此处我们使用了,stringstream ret对象来实现将数据以一定的格式拼接起来(和C语言中的sprintf类似),然后将其转化成字符串,写入到文件中。

以这样的方式可以很方便的以一定格式将数据写入文件中。?

?

按照指定格式读文件 -- 解析一定格式的字符串

我们上面以一定的格式将数据写入到了文件中,但是我们应该怎样读这些数据呢??

首先,要明确,像"姓名:? 张三? ?年龄:? 18 " 这样的数据,我们程序中(内存)只需要张三和18,那么如何将数据从规定格式的字符串中解析出来呢?

在C语言中,我们使用sprintf()来拼接字符串,使用sscanf()来解析字符串。但是c++中只提供了stringstream类实现拼接,并没有提供提供解析的方法。 所以,我们需要借助C语言的sscanf()来解析读取到的字符串。?

代码:? ?

int main(void) {

	ifstream io;
	// 用于存放从文件中读取的字符串(未解析)
	string data;

	// 用于存储解析的数据
	char name[32];
	int age = 0;

	io.open("data.txt");

	if (!io.is_open()) return 1;

	getline(io,data);  // 读取一行

	// 将字符串中对应的数据存放到name和age中去
	sscanf_s(data.c_str(), "姓名: %s 年龄: %d", name,sizeof(name), &age);

	cout << name << " " << age << endl;

	io.close();

	system("pause");

	return 0;
}

代码说明:?

上面我们给文件中按照一定格式写入了数据,我们先将这些数据读取出来(字符串),存放到data变量中。?

然后我们使用sscanf(vs中使用sscanf_s)来进行解析,将我们需要的数据解析到,name和age当中。?

sscanf解析字符串中必须格式和data中数据的格式相同(空白字符不需要,因为sscanf可以自动跳过空白字符,只要其它字符对应就行)?。需要解析出的数据,直接用格式化占位符代替,然后在后面写上用于存储的解析出数据的对应变量。

注意:?

我们代码中使用getline()函数来读取文件中的数据,表示一次读取一行。?

有两个参数,第一个参数表示,从哪里读取,第二个参数是存放读取到数据的变量。?

问: 为什么使用getline()?

1.? 就是我们需要读取一行数据的时候就使用getline就行。?

2. cin >> 和scanf()类似,都是遇到空白字符结束读取,如果一条数据中存在空白字符,那么使用cin >> 就无法读取完整的数据。? 所以此时使用getline()。?

3.? 上面的输入格式是,一条数据占一行,而且数据之间存在空白字符,所以使用getline读取。因为只有按照相同的格式才能正确的解析出来数据。(所以要按照写入的格式读取)?

?

文章来源:https://blog.csdn.net/weixin_68026222/article/details/135826162
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。