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++ clock()解析如何使用时钟计时的应用

    C++ clock()解析如何使用时钟计时的应用

    本篇文章是对c++中的clock()函数进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • OpenCV利用霍夫变换实现交通车道线检测

    OpenCV利用霍夫变换实现交通车道线检测

    经典霍夫变换用来检测图像中的直线,后来霍夫变换经过扩展可以进行任意形状物体的识别,例如圆和椭圆。本文就来利用霍夫变换实现交通车道线检测,需要的可以参考一下
    2022-09-09
  • C语言实现静态版通讯录的代码分享

    C语言实现静态版通讯录的代码分享

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态版通讯录,主要运用了结构体,一维数组,函数,分支与循环语句等等知识,需要的可以参考一下
    2023-01-01
  • C++可变参数的函数与模板实例分析

    C++可变参数的函数与模板实例分析

    这篇文章主要介绍了C++可变参数的函数与模板,非常重要的概念,需要的朋友可以参考下
    2014-08-08
  • Qt使用随机验证码的实现示例

    Qt使用随机验证码的实现示例

    有时候在登录界面需要验证码功能,这样能够防止被恶意程序攻击,本文主要介绍了Qt使用随机验证码的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 浅谈C++如何求等差素数列

    浅谈C++如何求等差素数列

    这篇文章主要介绍了浅谈C++如何求等差素数列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • C++如何用数组模拟链表

    C++如何用数组模拟链表

    大家好,本篇文章主要讲的是C++如何用数组模拟链表,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 一文带你简单了解c++正则表达式

    一文带你简单了解c++正则表达式

    正则表达式在匹配字符串,验证输入合法性时经常用到.C++ 11标准库中已经支持了正则表达式,下面这篇文章主要给大家介绍了关于c++正则表达式的相关资料,需要的朋友可以参考下
    2023-04-04
  • C++实现LeetCode(155.最小栈)

    C++实现LeetCode(155.最小栈)

    这篇文章主要介绍了C++实现LeetCode(155.最小栈),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++设计模式中控制反转与依赖注入浅析

    C++设计模式中控制反转与依赖注入浅析

    这篇文章主要介绍了C++设计模式中控制反转与依赖注入,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01

最新评论