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++做界面开发的时候,尤其是实现白板功能时需要自己实现一套撤销重做功能.如果是qt则有QUndoable对象,可以直接拿来用。但是如果是使用gdi绘图,则可能需要自己实现了。本文就来用C++实现自定义撤销重做功能,需要的可以参考一下
    2022-12-12
  • C/C++利用栈和队列实现停车场管理系统

    C/C++利用栈和队列实现停车场管理系统

    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要的小伙伴可以参考一下
    2022-06-06
  • C++之boost::array的用法

    C++之boost::array的用法

    这篇文章主要介绍了C++之boost::array的用法,以实例的形式简单讲述了静态数组的容器boost::array的使用技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • C语言实现返回字符串函数的四种方法

    C语言实现返回字符串函数的四种方法

    在C语言中实现函数返回字符串,首先要确定函数返回的字符串地址的来源,一般分为四种方式,下面这篇文章就给大家通过示例代码详细介绍这几种方法,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • c/c++ 标准库 bind 函数详解

    c/c++ 标准库 bind 函数详解

    bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。这篇文章主要介绍了c/c++ 标准库 bind 函数 ,需要的朋友可以参考下
    2018-09-09
  • MFC实现漂亮界面之美化按钮

    MFC实现漂亮界面之美化按钮

    这篇文章主要为大家详细介绍了MFC实现漂亮界面之美化按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • Qt项目实战之实现MP3音乐播放器

    Qt项目实战之实现MP3音乐播放器

    这篇文章主要为大家详细介绍了如何利用Qt实现MP3音乐播放器,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C++命名空间5种常见用法实例解析

    C++命名空间5种常见用法实例解析

    这篇文章主要介绍了C++命名空间5种常见用法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Qt两种定时器使用实现方式

    Qt两种定时器使用实现方式

    这篇文章主要给大家介绍了关于Qt两种定时器使用实现方式的相关资料,Qt中的定时器类是QTimer,QTimer不是一个可见的界面组件,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • C++进化后的const变量实例探究

    C++进化后的const变量实例探究

    这篇文章主要为大家介绍了C++进化后的const变量实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论