一、现有的文件读写方案
方案一:采用C++标准库读写
该库拥有输入输出模板类及两个标准实例化集:一个是用于操作char类型元素的实例化集(即常用的cin,cout等),另一个用于操作wchar_t类型元素的实例化集。
模板类以basic_
作为前缀,实例化的类去掉basic_
,例如basic_ios
与ios
。代码如下:
template<class charT, class traits = char_traits<charT>>
class basic_ios;
typedef basic_ios<char> ios;
方案二:采用QT库读写
QFile
针对QT控件内容有简单的读取方法,但使用不如标准库的广泛。
二、语法知识
2.1、各模板类的作用:
ios_base
:不依赖于流是输入流还是输出流的流的组件,描述了独立于模板参数(即字符类型和特征)的成员。basic_ios
:不依赖于流是输入流还是输出流的流的组件,继承自ios_base
。描述了依赖于模板参数(即字符类型和特征)的成员。basic_istream
:输入流模板类,可以读取和解释来自字符序列的输入,继承自basic_ios
。cin是这个模板类针对char参数的实例。basic_ostream
:输出流模板类,用于写入字符序列,继承自basic_ios
。cout是这个模板类针对char参数的实例。basic_iostream
:输入输出流模板类,此类采用虚继承从basic_istream
和basic_ostream
继承所有成员,从而能够执行输入和输出操作。basic_fstream
:对文件进行操作的输入/输出流模板类,此类继承自basic_iostream
。fstream因需要与文件关联,因此标准库没有提供类似cin, cout的类实例。
2.2、以char作为参数实例化以上类的继承关系图
三、用法
/**
* @brief 写文件测试
* @author zhangzhiyu
* @date 2023-04-27
*/
#include <vector>
#include <fstream>
#include <iomanip> // for std::setw
int main()
{
// 要写入的数据
std::vector<double> arr = {1.23, 4.56, 7.89, 0.12, 12, 23, 12.4, 234, 3, 45, 45.4, 125};
std::fstream fout;
fout.open("abc.txt", std::ios_base::out); // 以写入的形式打开文件"abc.txt", 不存在则创建
for (std::uint32_t i = 0; i < arr.size(); ++i) {
if (i % 5 == 0) { // 每隔5个数据换一行
fout << std::endl;
}
fout << std::setw(4) << i << ": " << std::setw(15) << arr[i] << ", "; // std::setw设置位宽,即每个数据间的间隔
}
fout.close(); // 显式的关闭流到文件的连接。
getchar();
return 0;
}