目录
?
在实际开发中,我们以一定的格式写入文件当中。?
其实就是使用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()函数来读取文件中的数据,表示一次读取一行。?
有两个参数,第一个参数表示,从哪里读取,第二个参数是存放读取到数据的变量。?
1.? 就是我们需要读取一行数据的时候就使用getline就行。?
2. cin >> 和scanf()类似,都是遇到空白字符结束读取,如果一条数据中存在空白字符,那么使用cin >> 就无法读取完整的数据。? 所以此时使用getline()。?
3.? 上面的输入格式是,一条数据占一行,而且数据之间存在空白字符,所以使用getline读取。因为只有按照相同的格式才能正确的解析出来数据。(所以要按照写入的格式读取)?
?