C++ 文件读写

目录

一、XML文件读写

1、写入XML文件

2、读取XML文件

二、JSON文件读写

1、写入JSON文件

2、读取JSON文件

3、写入JSON文件

4、读取JSON文件

三、CSV文件读写

1、写入CSV文件

2、读取CSV文件

四、Excel文件读写

1、写入Excel文件

2、读取Excel文件

五、INI文件读写

1、写入INI文件

2、读取INI文件


一、XML文件读写

在C++中读写XML文件,通常需要使用专门的库,因为C++标准库并没有直接提供对XML的支持。其中一个流行的库是TinyXML-2(也称为TinyXML2),它是一个简单、小巧但功能强大的XML解析器。

1、写入XML文件

#include "tinyxml2.h"  
#include <iostream>  
#include <fstream>  int main() {  tinyxml2::XMLDocument doc;  tinyxml2::XMLElement* root = doc.NewElement("Students");  doc.InsertFirstChild(root);  for (int i = 0; i < 3; ++i) {  tinyxml2::XMLElement* student = doc.NewElement("Student");  root->InsertEndChild(student);  tinyxml2::XMLElement* id = doc.NewElement("ID");  id->SetText(std::to_string(i + 1).c_str());  student->InsertEndChild(id);  tinyxml2::XMLElement* name = doc.NewElement("Name");  std::string nameStr = "Student" + std::to_string(i + 1);  name->SetText(nameStr.c_str());  student->InsertEndChild(name);  }  tinyxml2::XMLError eResult = doc.SaveFile("students.xml");  if (eResult != tinyxml2::XML_SUCCESS) {  std::cout << "Failed to save file\n";  return eResult;  }  std::cout << "File saved successfully\n";  return 0;  
}

2、读取XML文件

#include "tinyxml2.h"  
#include <iostream>  
#include <fstream>  int main() {  tinyxml2::XMLDocument doc;  tinyxml2::XMLError eResult = doc.LoadFile("students.xml");  if (eResult != tinyxml2::XML_SUCCESS) {  std::cout << "Failed to load file\n";  return eResult;  }  tinyxml2::XMLElement* root = doc.RootElement();  if (root == nullptr) {  std::cout << "Failed to get root element\n";  return tinyxml2::XML_ERROR_FILE_READ_ERROR;  }  for (tinyxml2::XMLElement* student = root->FirstChildElement("Student");  student != nullptr;  student = student->NextSiblingElement("Student")) {  tinyxml2::XMLElement* id = student->FirstChildElement("ID");  tinyxml2::XMLElement* name = student->FirstChildElement("Name")->NextSiblingElement("Name");  if (id && name) {  std::cout << "ID: " << id->GetText() << ", Name: " << name->GetText() << std::endl;  }  }  return 0;  
}

二、JSON文件读写

在C++中读写JSON文件,可以使用一些专门的库,如nlohmann/json(也称为json.hppjsonconsRapidJSON等)。这里我将展示如何使用nlohmann/json库来读写JSON文件。首先,你需要下载nlohmann/json的源代码并将其包含在你的项目中。

1、写入JSON文件

#include "json.hpp"  
#include <fstream>  
#include <iostream>  using json = nlohmann::json;  int main() {  // 创建一个JSON对象  json j;  j["name"] = "John Doe";  j["age"] = 30;  j["is_student"] = false;  j["grades"] = {  {"math", 85},  {"english", 92},  {"history", 88}  };  // 打开文件并写入JSON数据  std::ofstream o("student.json");  o << std::setw(4) << j << std::endl; // 使用setw(4)来格式化输出,使JSON更易读  if (!o.good()) {  std::cerr << "Failed to write to file\n";  return 1;  }  std::cout << "File written successfully\n";  return 0;  
}

2、读取JSON文件

#include "json.hpp"  
#include <fstream>  
#include <iostream>  using json = nlohmann::json;  int main() {  // 从文件读取JSON数据  std::ifstream i("student.json");  json j;  i >> j;  if (!i.good()) {  std::cerr << "Failed to read file\n";  return 1;  }  // 访问JSON数据  std::cout << "Name: " << j["name"] << std::endl;  std::cout << "Age: " << j["age"] << std::endl;  std::cout << "Is student: " << std::boolalpha << j["is_student"] << std::endl;  // 遍历grades数组  for (auto& grade : j["grades"].items()) {  std::cout << grade.key() << ": " << grade.value() << std::endl;  }  return 0;  
}

在Qt中,读写JSON文件通常使用QJsonDocumentQJsonObjectQJsonArray等类。

3、写入JSON文件

#include <QFile>  
#include <QJsonDocument>  
#include <QJsonObject>  
#include <QJsonArray>  
#include <QDebug>  int main(int argc, char *argv[]) {  // ... 初始化Qt应用程序等 ...  // 创建一个JSON对象  QJsonObject jsonObject;  jsonObject["name"] = "John Doe";  jsonObject["age"] = 30;  jsonObject["is_student"] = false;  // 创建一个grades数组  QJsonArray gradesArray;  gradesArray.append(QJsonObject{{"math", 85}});  gradesArray.append(QJsonObject{{"english", 92}});  gradesArray.append(QJsonObject{{"history", 88}});  // 将grades数组添加到JSON对象中  jsonObject["grades"] = gradesArray;  // 创建一个JSON文档并设置JSON对象为根对象  QJsonDocument jsonDoc(jsonObject);  // 将JSON文档写入文件  QFile file("student.json");  if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {  file.write(jsonDoc.toJson(QJsonDocument::Indented)); // 缩进以增加可读性  file.close();  }  // ... 清理并退出Qt应用程序 ...  
}

4、读取JSON文件

#include <QFile>  
#include <QJsonDocument>  
#include <QJsonObject>  
#include <QJsonArray>  
#include <QDebug>  int main(int argc, char *argv[]) {  // ... 初始化Qt应用程序等 ...  // 从文件读取JSON数据  QFile file("student.json");  if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {  QByteArray jsonData = file.readAll();  QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData);  // 检查文档是否解析成功  if (!jsonDoc.isNull()) {  // 获取根对象  QJsonObject jsonObject = jsonDoc.object();  // 访问JSON数据  qDebug() << "Name:" << jsonObject["name"].toString();  qDebug() << "Age:" << jsonObject["age"].toInt();  qDebug() << "Is student:" << jsonObject["is_student"].toBool();  // 遍历grades数组  QJsonArray gradesArray = jsonObject["grades"].toArray();  for (const QJsonValue &gradeValue : gradesArray) {  QJsonObject gradeObject = gradeValue.toObject();  qDebug() << "Subject:" << gradeObject.keys().first()  << "Grade:" << gradeObject.values().first().toInt();  }  }  file.close();  }  // ... 清理并退出Qt应用程序 ...  
}

三、CSV文件读写

在C++中读写CSV(Comma-Separated Values)文件通常不需要特殊的库,因为CSV文件本质上就是纯文本文件,只是数据以逗号分隔。然而,为了更方便地处理CSV文件,可以使用一些库,如csv-parserrapidcsvQt(如果你正在使用Qt框架)。

以下是一个简单的示例,展示了如何在不使用任何外部库的情况下使用C++标准库中的fstreamsstream来读写CSV文件。

1、写入CSV文件

#include <iostream>  
#include <fstream>  
#include <vector>  
#include <string>  int main() {  std::ofstream file("output.csv");  if (file.is_open()) {  std::vector<std::vector<std::string>> data = {  {"Name", "Age", "Country"},  {"John Doe", "30", "USA"},  {"Jane Smith", "25", "UK"}  };  for (const auto& row : data) {  for (size_t i = 0; i < row.size(); ++i) {  file << row[i];  if (i < row.size() - 1) {  file << ",";  }  }  file << std::endl;  }  file.close();  } else {  std::cerr << "Unable to open file";  }  return 0;  
}

2、读取CSV文件

#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <vector>  
#include <string>  int main() {  std::ifstream file("data.csv");  std::string line, value;  std::vector<std::vector<std::string>> data;  if (file.is_open()) {  while (std::getline(file, line)) {  std::istringstream iss(line);  std::vector<std::string> row;  while (std::getline(iss, value, ',')) {  row.push_back(value);  }  data.push_back(row);  }  file.close();  } else {  std::cerr << "Unable to open file";  }  // 打印数据  for (const auto& row : data) {  for (const auto& value : row) {  std::cout << value << " ";  }  std::cout << std::endl;  }  return 0;  
}

四、Excel文件读写

C++标准库并没有直接支持读写Excel文件(如.xlsx或较老的.xls格式)的功能,因为这些文件通常包含复杂的结构和元数据,远超出了CSV或纯文本文件的范畴。不过,你可以使用一些第三方库来在C++中读写Excel文件。

xlnt:这是一个C++库,用于读写Excel文件(.xlsx)。它提供了一个直观的API,可以方便地处理Excel工作簿、工作表、单元格等。

1、写入Excel文件

#include <xlnt/xlnt.hpp>  int main() {  // 创建一个新的工作簿  xlnt::workbook wb;  // 获取活动工作表  xlnt::worksheet ws = wb.active_sheet();  // 在单元格 A1 中写入数据  ws.cell("A1").value("Hello, World!");  ws.cell("B1").value(123);  // 保存工作簿到文件  wb.save("example.xlsx");  return 0;  
}

2、读取Excel文件

#include <xlnt/xlnt.hpp>  
#include <iostream>  int main() {  // 打开现有的工作簿  xlnt::workbook wb;  if (!wb.load("example.xlsx")) {  std::cerr << "Failed to open file for reading." << std::endl;  return 1;  }  // 获取活动工作表  xlnt::worksheet ws = wb.active_sheet();  // 读取单元格 A1 和 B1 的数据  std::cout << "A1: " << ws.cell("A1").to_string() << std::endl;  std::cout << "B1: " << ws.cell("B1").to_double() << std::endl;  return 0;  
}

五、INI文件读写

在C++中读写INI文件通常不是标准库直接支持的功能,但你可以使用第三方库或编写自己的解析器来处理INI文件格式。INI文件通常用于存储应用程序的配置信息,其格式相对简单,由节(sections)和键值对(key-value pairs)组成。

下面是一个简单的例子,展示了如何使用C++标准库函数来读写INI文件。请注意,这个例子没有处理所有可能的INI文件边缘情况,但它为基本的读写功能提供了一个出发点。

1、写入INI文件

void writeIniFile(const std::string& filePath, const std::map<std::string, std::map<std::string, std::string>>& iniData) {  std::ofstream iniFile(filePath);  if (!iniFile.is_open()) {  std::cerr << "Failed to open INI file for writing: " << filePath << std::endl;  return;  }  for (const auto& section : iniData) {  iniFile << "[" << section.first << "]" << std::endl;  for (const auto& keyValue : section.second) {  iniFile << keyValue.first << " = " << keyValue.second << std::endl;  }  iniFile << std::endl; // 在每个节之后添加一个空行以提高可读性  }  iniFile.close();  
}

2、读取INI文件

#include <iostream>  
#include <fstream>  
#include <sstream>  
#include <map>  
#include <string>  std::map<std::string, std::map<std::string, std::string>> readIniFile(const std::string& filePath) {  std::map<std::string, std::map<std::string, std::string>> iniData;  std::ifstream iniFile(filePath);  std::string currentSection = "";  if (!iniFile.is_open()) {  std::cerr << "Failed to open INI file: " << filePath << std::endl;  return iniData;  }  std::string line;  while (std::getline(iniFile, line)) {  // 去除行首尾的空白字符  line = std::regex_replace(line, std::regex("^\\s+|\\s+$"), "");  // 忽略空行和注释(以分号开头的行)  if (line.empty() || line[0] == ';') continue;  // 检查是否是一个新的节  if (line[0] == '[' && line.back() == ']') {  currentSection = line.substr(1, line.size() - 2);  continue;  }  // 查找键值对的分隔符  size_t pos = line.find('=');  if (pos == std::string::npos) continue; // 如果没有找到分隔符,则忽略该行  std::string key = line.substr(0, pos);  std::string value = line.substr(pos + 1);  // 将键值对添加到当前节的map中  iniData[currentSection][key] = value;  }  iniFile.close();  return iniData;  
}  int main() {  std::string filePath = "config.ini";  auto iniData = readIniFile(filePath);  // 打印读取到的数据  for (const auto& section : iniData) {  std::cout << "[" << section.first << "]" << std::endl;  for (const auto& keyValue : section.second) {  std::cout << keyValue.first << " = " << keyValue.second << std::endl;  }  std::cout << std::endl;  }  return 0;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/863574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

转盘输入法-总

序 转盘输入法&#xff0c;给你的聊天加点新意。它不用常见的九宫格或全键盘&#xff0c;而是把字母摆在圆盘上&#xff0c;一滑一滑&#xff0c;字就出来了&#xff0c;新鲜又直接。 PC屏幕键盘的对比 鉴于屏幕键盘这一新颖界面的局限性&#xff0c;当用户在操作时&#xff…

015、HBase分布式数据库与传统数据库的深度对比

目录 HBase分布式数据库与传统数据库的深度对比 1. 数据模型 1.1 传统关系型数据库 1.2 HBase 2. 扩展性 2.1 传统关系型数据库 2.2 HBase 3. 查询语言 3.1 传统关系型数据库 3.2 HBase 4. 事务支持 4.1 传统关系型数据库 4.2 HBase 5. 数据一致性 5.1 传统关系型…

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…

Elasticsearch环境搭建|ES单机|ES单节点模式启动|ES集群搭建|ES集群环境搭建

文章目录 版本选择单机ES安装与配置创建非root用户导入安装包安装包解压配置JDK环境变量配置single-node配置JVM参数后台启动|启动日志查看启动成功&#xff0c;访问终端访问浏览器访问 Kibana安装修改配置后台启动|启动日志查看浏览器访问 ES三节点集群搭建停止es服务域名配置…

C++面试题精选-2024/06/26

堆分配会比栈快吗 堆分配和栈分配在速度上并不直接可比,因为它们服务于不同的目的和场景,具有不同的特性和优势。以下是关于堆分配和栈分配速度方面的详细分析: 数据结构: 栈是一种线性数据结构,遵循先进后出(LIFO)的原则。堆则是一种树状的数据结构,允许随机插入和删…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

Elasticsearch 管道聚合:组合多个聚合

在Elasticsearch中&#xff0c;聚合&#xff08;Aggregations&#xff09;是处理和分析大量数据的关键工具。通过聚合&#xff0c;我们可以从海量的数据中提取出有价值的统计信息&#xff0c;如最大值、最小值、平均值、总和等。然而&#xff0c;有时单一聚合无法满足我们复杂的…

C语言之字符串存储差异分析

C语言之字符串存储差异分析 字符串字符串字面量字符数组动态分配字符串 结语 字符串 在C语言中&#xff0c;可以使用多种方式来创建字符串。但是&#xff0c;不同创建方式之间的区别&#xff0c;你了解么&#xff1f;。 字符串字面量 C语言 -- 字符串字面量创建方式 char *s…

Games101学习笔记 Lecture 14: Ray Tracing 2 (Acceleration Radiometry)

Lecture 14: Ray Tracing 2 (Acceleration & Radiometry 一、加速光线追踪 AABB1.均匀网格 Uniform Spatial Partitions (Grids)①前处理-构建加速网格②射线与场景相交③网格分辨率④适用情况 2.空间划分KD-Tree①预处理②数据结构③遍历④问题 3.对象划分 & 包围盒层…

Lua: 轻量级多用途脚本语言

Lua 是一种高效而轻量级的脚本语言&#xff0c;具备强大的扩展性和灵活性&#xff0c;广泛应用于游戏开发、嵌入式系统、Web 应用等多个领域。本文将深入探讨 Lua 的特性、应用场景以及如何使用 Lua 进行开发。 1. Lua 的起源与发展 Lua 的发展始于上世纪90年代初&#xff0c;…

【微代码】Linux同步机制complete基本用法,以及如何封装一个内核态sleep的工具函数ksleep?

文章目录 背景基本代码和用法内核态sleep效果其他 背景 Linux提供了多种同步机制&#xff0c;其中complete就是一种。complete能够阻塞等待状态同步&#xff0c;并且等待对方释放中会调用schedule让出CPU。如果想在内核中等待一个固定时长继续执行他是一个非常不错的选择。有点…

为什么明明引入依赖了却总是爆红说不认识?

把maven中的依赖部分dependencies删掉&#xff0c;重新刷新一遍&#xff0c;再粘贴回去&#xff0c;重新刷新一遍就可以了

Spark SQL----分布式SQL引擎

Spark SQL----分布式SQL引擎 一、运行Thrift JDBC/ODBC服务器二、运行Spark SQL CLI2.1 Spark SQL命令行选项2.2 hiverc文件2.3 路径的说明2.4 支持的注释类型2.5 Spark SQL CLI交互式Shell命令2.6 例子 Spark SQL还可以使用JDBC/ODBC或命令行接口充当分布式查询引擎。在这种模…

mysql8一键安装脚本(linux) 拿走即用

创建一个shell文件,将下面的代码放里面去,然后放到linux服务器上运行就可以了 #!/bin/bash#---------------------* # * # 2021-10-08 * # install mysql-8 * # * #---------------------*route=/usr #包存放路径 mys…

掌握 Vue 组件通信:打造高效、灵活的前端应用

一、引言 Vue.js&#xff0c;作为现代前端开发的热门框架&#xff0c;以其组件化架构引领了开发效率与代码维护性的新标准。组件通信&#xff0c;作为这一架构中的关键环节&#xff0c;对于构建响应式、可扩展的应用至关重要。本文将探讨 Vue 组件通信的多种策略&#xff0c;旨…

c++习题04-忙碌的工人

目录 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 2&#xff0c;分析 3&#xff0c;伪代码 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 1&#xff0c;图形 根据题目&#xff0c;绘制出来的图形如下&#x1f447; 之后再绘制甲经过楼梯…

【数据结构】--栈

&#x1f44c;个人主页: 起名字真南 &#x1f923;个人专栏:【数据结构初阶】 【C语言】 目录 1 栈1.1 栈的概念和结构1.2 栈的实现1.2.1 头文件1.2.2 初始化1.2.3 销毁1.2.4 打印所有元素1.2.5 入栈1.2.6 出栈1.2.7 获取栈顶数据1.2.8 判空1.2.9 获取元素个数 1 栈 1.1 栈的概…

spring mvc实现一个自定义Formatter请求参数格式化

使用场景 在Spring Boot应用中&#xff0c;Formatter接口用于自定义数据的格式化&#xff0c;比如将日期对象格式化为字符串&#xff0c;或者将字符串解析回日期对象。这在处理HTTP请求和响应时特别有用&#xff0c;尤其是在展示给用户或从用户接收特定格式的数据时。下面通过…

四、golang基础之defer

文章目录 一、定义二、作用三、结果四、recover错误拦截 一、定义 defer语句被用于预定对一个函数的调用。可以把这类被defer语句调用的函数称为延迟函数。 二、作用 释放占用的资源捕捉处理异常输出日志 三、结果 如果一个函数中有多个defer语句&#xff0c;它们会以LIFO…

昇思MindSpore学习入门-函数式自动微分

函数式自动微分 神经网络的训练主要使用反向传播算法&#xff0c;模型预测值&#xff08;logits&#xff09;与正确标签&#xff08;label&#xff09;送入损失函数&#xff08;loss function&#xff09;获得loss&#xff0c;然后进行反向传播计算&#xff0c;求得梯度&#…