去年接手了一个项目,要求使用某ADC的接口实现一个波形显示器,由于该ADC驱动给的接口只有C++的能看懂且能用,因此考虑到兼容性选了MFC作为开发框架。在实现过程中,需要实现一个将已获取数据保存的功能,而第一想法便是保存为csv文件。因此,在此记录一下MFC进行csv文件创建,写入的方法:
1.创建文件:
FILE *f = NULL;
CString CSVFileName = CTime::GetCurrentTime().Format("DataSave_%m-%d_%H-%M-%S.csv"); //以系统时间创建数据文件
if (_tfopen_s(&f, CSVFileName, _T("wb")) != 0) //创建文件
{
//处理文件创建结果
}
2.写入一行数据:
CStringArray sLine; //CSV单行临时数组
CSVTempstr.Format(_T("时间戳"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集数值"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集量程") + RangeCtrl);
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("采集频率") + FreqCtrl +_T("Hz"));
sLine.Add(CSVTempstr);
CSVTempstr.Format(_T("修正系数") + CorrectValue);
sLine.Add(CSVTempstr);
PutCSVItemLine(f, sLine); //写入一行数据
3.关闭文件:
fclose(f); //关闭CSV文件
4.配套单行数据写入函数:
//将数据项写入CSV文件
int PutCSVItemLine(FILE* file, CStringArray& sItemLine)
{
//准备行数据
CStringA sLineString;
//循环取子项
for (INT_PTR nItem = 0; nItem < sItemLine.GetSize(); nItem++)
{
//取子项
CStringA sItem(sItemLine.GetAt(nItem));
//查找是否包含引号或逗号
if (sItem.FindOneOf("\",\r\n") >= 0)
{
//单引号替换为双引号
sItem.Replace("\"", "\"\"");
//首尾用引号包含
sItem.Insert(0, "\""); sItem += "\"";
}
//添加逗号分隔符
if (!sLineString.IsEmpty()) sLineString += ",";
//追加数据
sLineString += sItem;
}
//行尾添加\r\n
sLineString += "\r\n";
//写入文件
return (int)fwrite((LPCSTR)sLineString, 1, sLineString.GetLength(), file);
}
5.完整应用:
//应用实例
void TestCSV()
{
FILE *f = NULL;
if(_tfopen_s(&f, _T("E:\\TEMP\\test.csv"), _T("wb")) == 0)
{
{
CStringArray sLine;
sLine.Add(_T("1"));
sLine.Add(_T("\"2\""));
sLine.Add(_T("3,ABC"));
sLine.Add(_T("4"));
sLine.Add(_T("\"\""));
sLine.Add(_T(","));
sLine.Add(_T("\",\""));
sLine.Add(_T(""));
sLine.Add(_T("aaa\",\"bbb"));
PutCSVItemLine(f, sLine);
}
{
CStringArray sLine;
sLine.Add(_T("1"));
sLine.Add(_T("\"2\""));
sLine.Add(_T("3,ABC"));
sLine.Add(_T("4"));
sLine.Add(_T("\"\""));
sLine.Add(_T(","));
sLine.Add(_T("\",\""));
sLine.Add(_T(""));
sLine.Add(_T("aaa\"??bbb\""));
PutCSVItemLine(f, sLine);
}
fclose(f);
}
感谢https://blog.csdn.net/zgl7903/article/details/104495742/ 提供当时的解决思路。