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

目录

按照指定格式写文件

代码说明:  

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

代码说明: 

注意: 

问: 为什么使用getline()?


 

按照指定格式写文件

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

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

#include 
#include 
#include 
#include 
#include 

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;
}

c++文件操作(2)-- 按照指定格式读写文件_第1张图片 

代码说明:  

大部分操作和写文件类似,只是此处我们使用了,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读取。因为只有按照相同的格式才能正确的解析出来数据。(所以要按照写入的格式读取) 

 

你可能感兴趣的:(c++,开发语言)