C++中实现保存数据到CSV文件

 更新时间:2023年08月04日 10:21:35   作者:熊叫大雄  
这篇文章主要介绍了C++中实现保存数据到CSV文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

C++保存数据到CSV文件

主要是今天工作的时候需要把一些数据保存到本地,因为是一些预测值和标签的对比,还有预测值的概率,所以想到用CSV文件来保存,大概查了一下,还是比较简单的,所以记录一下。

首先要说明的是CSV文件有点类似excel文件,也可以用excel文件直接打开的。在写数据到CSV文件的时候要注意,字符串逗号表示的是换列,换行符号就是换行,所以在写数据的时候要注意好这两点就可以了。

然后写的时候也很简单,直接用C++的ofstream就可以实现了,ofstream有一个操作是"<<",这个也很好用,就类似std::cout的操作一样即可。

比如我现在的数据是比较统一的,每一个样本是一行,一行数据要分成四列,第一列是样本的图像地址,第二列是标签,第三列是最终预测值,第四列是概率,每一列的格式是一样的,那么我的代码就是这样:

ofstream file(CSV_PATH);
if (file)
{
    file << image_path << "," << label << "," << prediction << "," << probability << "\n";
}
file.close();

这样就可以实现了,还是比较容易的。

C++对csv文件操作(读、写、追加)

使用说明:csv文件按照","进行分隔。因此每个内容中需避免出现","

1.读csv文件

c++通过文件读入方式打开文件。即通过ifstream类进行打开文件。

 
string fname = "test.csv";
//以读入方式打开文件
ifstream csv_data(fname, ios::in);
if (!csv_data.is_open())
{
	cout << "Error: opening file fail" << endl;
	exit(1);
}
else {
	string line;
	vector<string> words; //声明一个字符串向量
	string word;
	// ------------读取数据-----------------
	// 读取标题行
	getline(csv_data, line);
	istringstream sin;
	// 按行读取数据
	while (getline(csv_data, line))
	{
		// 清空vector及字符串流,只存当前行的数据
		words.clear();
		sin.clear();
		sin.str(line);
		//将字符串流sin中的字符读到字符串数组words中,以逗号为分隔符
		while (getline(sin, word, ','))
		{
			cout << word << endl;
			words.push_back(word); //将每一格中的数据逐个push
		}
	}
	csv_data.close();
}

2.写入csv文件

c++通过文件写入方式打开文件进行写入。即通过ofstream类进行写入,并在打开文件中指明ios::out。

说明:默认通过iso::out方式进行写入,当文件不存在时会进行创建

string fname = "test.csv";
ofstream outFile(fname, ios::out);
// 写入标题行
outFile << "name" << ','
<< "income" << ','
<< "expenditure" << ','
<< "addr" << endl;
// ********写入两行数据*********
outFile << "zhangsan" << ','
<< "3000" << ','
<< "1200" << ','
<< "陕西省" << endl;
outFile << "lisi" << ','
<< to_string(2032.1) << ','
<< to_string(789.2) << ','
<< "北京市" << endl;
//数字需转为字符串进行写入,csv文件结束一行写入需要"\n"或者endl进行换行
outFile.close();

3.向csv文件中追加内容

与第2部分几乎相同,只不过是打开文件时选择ios::app方式进行。当文件不存在时会进行创建

ofstream outFile(fname, ios::app);
// ********写入两行数据*********
outFile << "wangwu" << ','
	<< "1234" << ','
	<< to_string(12.32) << ','
	<< "河南省" << endl;
outFile << "lisi" << ','
	<< to_string(2032.1) << ','
	<< to_string(789.2) << ','
	<< "北京市" << endl;
//数字需转为字符串进行写入,csv文件结束一行写入需要"\n"或者endl进行换行
outFile.close();

4.具体使用

4.1读入csv文件

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
using namespace std;
void PrintCSVLine(vector<string> line_data)
{
	//此语法仅在C++11中适用
	for (string str : line_data)
	{
		cout << str << " ";
	}
	cout << endl;
}
//读入csv文件
int main() {
	string fname = "test.csv";
	//以读入方式打开文件
	ifstream csv_data(fname, ios::in);
	if (!csv_data.is_open())
	{
		cout << "Error: opening file fail" << endl;
		exit(1);
	}
	else {
		string line;
		vector<string> words; //声明一个字符串向量
		string word;
		// ------------读取数据-----------------
		// 读取标题行
		getline(csv_data, line);
		istringstream sin;
		// 按行读取数据
		while (getline(csv_data, line))
		{
			// 清空vector及字符串流,只存当前行的数据
			words.clear();
			sin.clear();
			sin.str(line);
			//将字符串流sin中的字符读到字符串数组words中,以逗号为分隔符
			while (getline(sin, word, ','))
			{
				//cout << word << endl;
				words.push_back(word); //将每一格中的数据逐个push
			}
			//输出此行中的内容
			PrintCSVLine(words);
		}
		csv_data.close();
	}
}

4.2写入csv文件

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
	string fname = "test.csv";
	ofstream outFile(fname, ios::out);
	if (outFile.is_open())  // 检查文件是否打开成功
	{
		// 写入标题行
		outFile << "name" << ','
			<< "income" << ','
			<< "expenditure" << ','
			<< "addr" << endl;
		// ********写入两行数据*********
		outFile << "zhangsan" << ','
			<< "3000" << ','
			<< "1200" << ','
			<< "陕西省" << endl;
		outFile << "lisi" << ','
			<< to_string(2032.1) << ','
			<< to_string(789.2) << ','
			<< "北京市" << endl;
		//数字需转为字符串进行写入,csv文件结束一行写入需要"\n"或者endl进行换行
		outFile.close();
	}
	else
	{
		cout << "文件无法打开!" << endl;
	}
}
 

4.3向csv文件追加

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
	string fname = "test.csv";
	//先判断文件是否存在
	ifstream file(fname);
	if (!file.is_open()) {
		cout << "File does not exist!" << endl;
		return 1;
	}
	else {
		cout << "File exists!" << endl;
		file.close();//必须先关闭文件后才可写入
		ofstream outFile(fname, ios::app);
		// ********写入两行数据*********
		outFile << "wangwu" << ','
			<< "1234" << ','
			<< to_string(12.32) << ','
			<< "河南省" << endl;
		outFile << "lisi" << ','
			<< to_string(2032.1) << ','
			<< to_string(789.2) << ','
			<< "北京市" << endl;
		//数字需转为字符串进行写入,csv文件结束一行写入需要"\n"或者endl进行换行
		outFile.close();
	}
	return 0;
}
 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C/C++使用C语言实现多态

    C/C++使用C语言实现多态

    这篇文章主要介绍了C/C++多态的实现机制理解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • C语言常量介绍

    C语言常量介绍

    这篇文章介绍了C语言中的常量,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C++ 类的构造函数详解及实例

    C++ 类的构造函数详解及实例

    这篇文章主要介绍了C++ 类的构造函数详解及实例的相关资料,学习C++ 的朋友对构造函数肯定不陌生,非常重要的基础知识,这里就详细介绍下,需要的朋友可以参考下
    2016-12-12
  • C++中的friend友元函数详细解析

    C++中的friend友元函数详细解析

    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
    2013-09-09
  • C++ cin不同状态详细讲解

    C++ cin不同状态详细讲解

    cin是C++编程语言中的标准输入流对象,即istream类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即ostream类的对象,cerr是标准错误输出流的对象,也是ostream类的对象
    2022-10-10
  • VC++ 中ListCtrl经验总结

    VC++ 中ListCtrl经验总结

    这篇文章主要介绍了VC++ 中ListCtrl经验总结的相关资料,需要的朋友可以参考下
    2015-06-06
  • QT实现QMessageBox中文按钮示例详解

    QT实现QMessageBox中文按钮示例详解

    这篇文章主要为大家详细介绍了QT实现QMessageBox中文按钮的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-11-11
  • C语言中野指针和空指针的区别

    C语言中野指针和空指针的区别

    本文主要介绍了野指针和空指针的概念、用途、原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • C++内存序的操作方法

    C++内存序的操作方法

    在C++中,内存序(Memory Order)是一个非常重要的概念,特别是在多线程编程中,本文通过实例代码介绍C++内存序的相关知识,感兴趣的朋友一起看看吧
    2025-11-11
  • C++ 设置和获取当前工作路径的实现代码

    C++ 设置和获取当前工作路径的实现代码

    这篇文章主要介绍了C++ 设置和获取当前工作路径的实现代码,防止DLL加载不到配置和文件,需要的朋友可以参考下
    2017-09-09

最新评论