目录
按照指定格式写文件
代码说明:
按照指定格式读文件 -- 解析一定格式的字符串
代码说明:
注意:
问: 为什么使用getline()?
文章来源地址https://www.toymoban.com/news/detail-821917.html
按照指定格式写文件
在实际开发中,我们以一定的格式写入文件当中。
其实就是使用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://www.toymoban.com/news/detail-821917.html
到了这里,关于c++文件操作(2)-- 按照指定格式读写文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!