C++读写(CSV,Yaml,二进制)文件的方法详解

C++读写(CSV, Yaml, 二进制)文件的方法详解

本文将介绍如何使用C++进行CSV、Yaml和二进制文件的读写操作。在开始之前,应该了解C++的基本语法、文件操作和相应的库的使用,例如fstream、yaml-cpp、boost等。

读写CSV文件

CSV是一种常用的格式,用于存储表格数据。在C++中读取和写入CSV文件,可以使用逗号作为分隔符,并使用fstream库进行操作。

读取CSV文件

以下是一个简单的CSV文件:

name,age,gender
Alice,20,Female
Bob,25,Male
Charlie,30,Male

我们可以使用如下代码读取该文件:

#include <fstream>
#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main() {
  ifstream fin("example.csv");
  if (!fin.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  vector<vector<string>> data;
  string line;
  while (getline(fin, line)) {
    vector<string> row;
    size_t pos = 0;
    string token;
    while ((pos = line.find(',')) != string::npos) {
      token = line.substr(0, pos);
      row.push_back(token);
      line.erase(0, pos + 1);
    }
    row.push_back(line);
    data.push_back(row);
  }

  fin.close();

  for (const auto& row : data) {
    for (const auto& cell : row) {
      cout << cell << '\t';
    }
    cout << endl;
  }

  return 0;
}

输出结果如下:

name    age     gender  
Alice   20      Female  
Bob     25      Male    
Charlie 30      Male    

写入CSV文件

以下会将数据写入CSV文件:

#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

int main() {
  ofstream fout("example.csv");
  if (!fout.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  vector<vector<string>> data{{"name", "age", "gender"}, {"Alice", "20", "Female"}, {"Bob", "25", "Male"}, {"Charlie", "30", "Male"}};
  for (const auto& row : data) {
    for (const auto& cell : row) {
      fout << cell << ',';
    }
    fout << endl;
  }

  fout.close();

  return 0;
}

这将创建一个名称为example.csv的文件,其中包含以下内容:

name,age,gender,
Alice,20,Female,
Bob,25,Male,
Charlie,30,Male,

读写Yaml文件

Yaml是一种常用的格式,用于存储结构化数据。在C++中读取和写入Yaml文件,可以使用yaml-cpp库进行操作。

读取Yaml文件

以下是一个简单的Yaml文件:

name: Alice
age: 20
gender: Female

我们可以使用如下代码读取该文件:

#include <fstream>
#include <iostream>
#include <yaml-cpp/yaml.h>

using namespace std;

int main() {
  ifstream fin("example.yaml");
  if (!fin.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  YAML::Node node = YAML::Load(fin);
  fin.close();

  cout << "name: " << node["name"].as<string>() << endl;
  cout << "age: " << node["age"].as<int>() << endl;
  cout << "gender: " << node["gender"].as<string>() << endl;

  return 0;
}

输出结果如下:

name: Alice
age: 20
gender: Female

写入Yaml文件

以下会将数据写入Yaml文件:

#include <fstream>
#include <iostream>
#include <yaml-cpp/yaml.h>

using namespace std;

int main() {
  YAML::Node node;
  node["name"] = "Alice";
  node["age"] = 20;
  node["gender"] = "Female";

  ofstream fout("example.yaml");
  if (!fout.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  fout << node;
  fout.close();

  return 0;
}

这将创建一个名称为example.yaml的文件,其中包含以下内容:

age: 20
gender: Female
name: Alice

读写二进制文件

二进制文件是一种使用二进制编码数据的文件。在C++中读写二进制文件,可以使用fstream库进行操作。

读取二进制文件

以下是一个简单的二进制文件:

#include <fstream>
#include <iostream>

using namespace std;

struct Person {
  string name;
  int age;
  string gender;
};

int main() {
  ifstream fin("example.bin", ios::in | ios::binary);
  if (!fin.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  Person person;
  fin.read(reinterpret_cast<char*>(&person), sizeof(Person));
  fin.close();

  cout << "name: " << person.name << endl;
  cout << "age: " << person.age << endl;
  cout << "gender: " << person.gender << endl;

  return 0;
}

输出结果如下:

name: Alice
age: 20
gender: Female

写入二进制文件

以下会将数据写入二进制文件:

#include <fstream>
#include <iostream>

using namespace std;

struct Person {
  string name;
  int age;
  string gender;
};

int main() {
  Person person{"Alice", 20, "Female"};

  ofstream fout("example.bin", ios::out | ios::binary);
  if (!fout.is_open()) {
    cerr << "Failed to open file." << endl;
    return 1;
  }

  fout.write(reinterpret_cast<const char*>(&person), sizeof(Person));
  fout.close();

  return 0;
}

这将创建一个名称为example.bin的文件,其中包含以下内容:

0x41 0x6c 0x69 0x63 0x65 0x14 0x00 0x00 0x00 0x46 0x65 0x6d 0x61 0x6c 0x65

其中可以看到数据以二进制形式存储。

总结

本文介绍了如何在C++中读写CSV、Yaml和二进制文件。读取CSV文件时,我们使用逗号作为分隔符,并使用fstream库进行操作;读写Yaml文件时,我们使用yaml-cpp库进行操作;读写二进制文件时,我们使用fstream库进行操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++读写(CSV,Yaml,二进制)文件的方法详解 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • 盘点科技界最重要的30位年轻美女!

    盘点科技界最重要的30位年轻美女攻略 1. 编辑准备 在撰写这篇文章之前,作者需要做好以下的编辑准备工作: 1.1 确定主题 首先需要确定主题,这里是“盘点科技界最重要的30位年轻美女”。 1.2 收集信息 然后需要进行信息收集,这里可以通过网络搜索、读书杂志等途径收集资料。 1.3 分类筛选 在收集到的信息中,需要进行分类筛选,挑选出符合主题的内容。在这个…

    人工智能概论 2023年5月25日
    00
  • Python bsonrpc源码解读

    Python bsonrpc源码解读 简介 Python bsonrpc是一种基于消息传递机制的RPC通信框架,它使用BSON作为数据序列化格式,支持两个进程或线程之间的通信。本文主要对Python bsonrpc框架的源码进行解读,包括其核心概念和实现原理。 核心概念 Service: 服务接口类,定义了服务端提供的远程方法。 ServiceHandler…

    人工智能概览 2023年5月25日
    00
  • Python缓存技术实现过程详解

    Python缓存技术实现过程详解 什么是缓存技术? 缓存技术是指在软件系统设计中,为了提高数据读写性能而采用的一种技术。它将数据存放在缓存存储器中,以供后续快速访问。 在Python中,缓存技术常用于优化函数的执行速度。由于某些复杂操作的计算较为耗时,为了避免重复计算,可以将计算结果缓存下来,以备下一次调用使用。 Python如何实现缓存技术? Python…

    人工智能概论 2023年5月25日
    00
  • Opencv3.4.0实现视频中的帧保存为图片功能

    下面是使用OpenCV 3.4.0实现视频中的帧保存为图片的步骤和示例: 步骤 导入OpenCV库 使用Python可以通过以下命令导入OpenCV库 python import cv2 读取视频文件 使用cv2.VideoCapture()函数读取视频文件。如下所示: python video = cv2.VideoCapture(‘test.mp4’) …

    人工智能概论 2023年5月25日
    00
  • Nginx本地目录映射实现代码实例

    当我们在使用Nginx进行Web开发时,经常会使用到本地目录映射,将静态文件从本地路径映射到Nginx的虚拟主机路径。这样可以提高网站的访问速度和安全性。下面就给大家分享一下“Nginx本地目录映射实现代码实例”的完整攻略。 一、本地目录映射的实现方式 1.1. Nginx的alias指令 Nginx的alias指令可以将本地路径映射到Nginx的虚拟主机路…

    人工智能概览 2023年5月25日
    00
  • Python检测网络延迟的代码

    请看下面的完整攻略,包含了Python检测网络延迟代码的详细讲解,并提供了两个示例说明: 背景 在进行网络应用开发时,需要检测网络延迟来判断网络连接的质量,以便做出相应的调整。Python作为一门通用性编程语言,也可以用来实现这一功能。 实现方法 Python中可以使用第三方库进行网络延迟检测,下面将介绍两种主要方法: 方案一:使用ping命令 在Pytho…

    人工智能概论 2023年5月25日
    00
  • 完美解决torch.cuda.is_available()一直返回False的玄学方法

    下面我将为你详细讲解如何完美解决torch.cuda.is_available()一直返回False的问题。 问题描述 在使用PyTorch进行深度学习时,我们通常会使用GPU加速训练,其中一个常用的判断是否可用的方法是使用torch.cuda.is_available()。然而,在某些情况下,这个函数会一直返回False,即使我们的机器上已经安装了CUDA…

    人工智能概论 2023年5月25日
    00
  • pytorch加载预训练模型与自己模型不匹配的解决方案

    加载预训练模型是深度学习中常用的技巧之一,可以利用预训练模型的权重来加快模型的训练速度,同时也提高了模型的精度。然而,有时候我们可能需要在一个不同的任务中使用一个预训练的模型,而这个预训练模型可能与我们自己定义的模型结构不匹配的情况,这时我们就需要一些解决方案。下面我将介绍几种PyTorch加载预训练模型与自己模型不匹配的解决方案。 方案一:从预训练模型中提…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部