去年接手了一个项目,要求使用某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/ 提供当时的解决思路。