MFC保存曲线坐标数据用什么方式比较好

之前用TXT文本来存储,这个数据有点多了,还有很多条的要保存,删除管理

参考GPT和自己的思路:建议使用二进制文件来存储曲线坐标数据,因为它可以更有效地存储大量的数据,并且读写速度也比文本文件更快。另外,可以使用文件管理类来管理这些数据,方便数据的删除和保存。

以下内容部分参考ChatGPT模型:


你可以考虑使用二进制文件来存储曲线坐标数据,这样可以节省存储空间,并且读写速度也更快。你可以使用C++中的fstream库来实现文件的读写操作。下面是一个简单的示例代码:

#include <fstream>
#include <vector>

struct Point {
    double x;
    double y;
};

bool SaveData(const std::vector<Point>& data, const std::string& filename) {
    std::ofstream file(filename, std::ios::binary);

    if (!file.is_open()) {
        return false;
    }

    // 写入数据条数
    int count = data.size();
    file.write(reinterpret_cast<const char*>(&count), sizeof(count));

    // 循环写入数据
    for (const auto& point : data) {
        file.write(reinterpret_cast<const char*>(&point), sizeof(point));
    }

    file.close();
    return true;
}

bool LoadData(std::vector<Point>& data, const std::string& filename) {
    std::ifstream file(filename, std::ios::binary);

    if (!file.is_open()) {
        return false;
    }

    // 读取数据条数
    int count;
    file.read(reinterpret_cast<char*>(&count), sizeof(count));

    // 循环读取数据
    Point point;
    for (int i = 0; i < count; i++) {
        file.read(reinterpret_cast<char*>(&point), sizeof(point));
        data.push_back(point);
    }

    file.close();
    return true;
}

使用示例:

int main() {
    std::vector<Point> data = {{1.0, 2.0}, {3.0, 4.0}, {5.0, 6.0}};
    SaveData(data, "data.bin");

    std::vector<Point> loaded_data;
    LoadData(loaded_data, "data.bin");

    return 0;
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快

引用new bing作答:
在MFC中,可以使用CStdioFile类来保存文本格式的曲线坐标数据,也可以使用CFile类来保存二进制格式的数据。

以保存文本格式数据为例,可以按照以下步骤进行:

创建一个CStdioFile对象并打开文件,例如:

CStdioFile file;
if (file.Open(FILE_NAME, CFile::modeCreate | CFile::modeWrite)) {
    // 文件打开成功
} else {
    // 文件打开失败
}

其中FILE_NAME是要保存的文件名。

将坐标数据写入文件,例如:

CString strLine;
for (int i = 0; i < nCount; i++) {
    strLine.Format(_T("%f, %f\r\n"), arrX[i], arrY[i]);
    file.WriteString(strLine);
}

其中nCount是坐标点数,arrX和arrY分别是存储X轴和Y轴坐标的数组。

关闭文件,例如:

file.Close();

如果要保存二进制格式的数据,则可以按照以下步骤进行:

创建一个CFile对象并打开文件,例如:

CFile file;
if (file.Open(FILE_NAME, CFile::modeCreate | CFile::modeWrite)) {
    // 文件打开成功
} else {
    // 文件打开失败
}

其中FILE_NAME是要保存的文件名。

将坐标数据写入文件,例如:

file.Write(arrX, nCount * sizeof(double));
file.Write(arrY, nCount * sizeof(double));

其中nCount是坐标点数,arrX和arrY分别是存储X轴和Y轴坐标的数组。

关闭文件,例如:

file.Close();
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/375947
  • 这篇博客也不错, 你可以看下C语言 逐行读txt文件中的内容进行修改后写到新文件中
  • 除此之外, 这篇博客: 统计文本的字符、单词、空格、段落数中的 注意:要先自己再桌面创建一个txt文本文件,往里添加英文文本保存,查询该文本文件路径,用于之后访问该文件时使用! 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 下面展示一些 内联代码片

    #include <stdio.h>
    #include <stdlib.h>
    void main()
    {
    	FILE *fp;
    	char ch,address[100];
    	int i,a,b,c,n;
    	i=a=b=c=n=0;
        printf("文件名:");
    	scanf("%s",address);
    	fp=fopen(address,"r");
    	if(fp==NULL)
    	{
    		printf("can not open the file\n");
    		exit(0);
    	}
    	ch=fgetc(fp);
    	while (ch!=EOF)
    	{
    		putchar(ch);
    		ch=fgetc(fp);
    	}
    	printf("\n");
    	rewind(fp);
    	ch=fgetc(fp);
    	while (ch!=EOF)
    	{
    		i++;       //i统计字符数量
    		if(ch==' ')     //a统计空格数量
    			a++;
    		ch=fgetc(fp);     
    		
    	}rewind(fp);
       ch=fgetc(fp);
       if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')          //判断通篇里第一个字符是否为字母,若判断条件为真,直接b+1;
    	   b++;
        while (ch!=EOF)
    	{
    		if(!(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'))         //b统计单词数量
    		{	ch=fgetc(fp);
    		    if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
    				b++;
    		}
    		else ch=fgetc(fp);
    	}
    	rewind(fp);
       ch=fgetc(fp);
        while (ch!=EOF)
    	{
    		if(ch=='\n')							//c统计段落数量
    		{
    			ch=fgetc(fp);
    			while(ch==' ')	
    			{   
    				ch=fgetc(fp);
    				if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')    /*  每一段后面必须有回车+空格(可能不止一个)+
    														  字母,该段才计数加一,致使最后一段无法在此处
    														  被计数,因此在输出c的时候,应该再+1   */
    					c++;
    			}
    		}
    		else ch=fgetc(fp);
    	}
    	fclose(fp);
    printf("空格有%d个,字符有%d个,单词有%d个,段落有%d段",a,i,b,c+1);   
    }
    

    流程框图

  • 您还可以看一下 夏曹俊老师的网络小说抓取软件的设计与研发——来自企业开发实践经验课程中的 单章节txt生成功能的实现小节, 巩固相关知识点

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
如果数据较多,保存到单个TXT文本可能不太方便管理和读取。比较好的方式是将数据保存到二进制文件中,可以减小文件大小并提高读写速度。此外,可以考虑使用数据库进行管理。

以下是保存数据到二进制文件中的示例代码:

void SaveDataToBinaryFile(const CString& filePath, const double* pData, int count)
{
    CFile file;
    if (file.Open(filePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
    {
        file.Write(pData, count * sizeof(double));
        file.Close();
    }
}

其中,filePath表示文件路径,pData表示数据指针,count表示数据数量。可以将需要保存的数据封装成一个结构体,再进行保存。

读取数据的示例代码如下:

void LoadDataFromBinaryFile(const CString& filePath, double* pData, int count)
{
    CFile file;
    if (file.Open(filePath, CFile::modeRead | CFile::typeBinary))
    {
        file.Read(pData, count * sizeof(double));
        file.Close();
    }
}

使用时,可以根据需要删除或移动文件。具体操作可以参考以下代码:

// 删除文件
CFile::Remove(filePath);

// 移动文件
CFile::Rename(oldPath, newPath);

如果需要使用数据库管理数据,可以使用MFC自带的数据库类CRuntimeClass和CRecordset进行操作。这里代码就不一一列举了,可以参考MFC官方文档和例子。
如果我的回答解决了您的问题,请采纳!

引用chatGPT作答,对于保存曲线坐标数据,可以考虑以下几种方式:

1.CSV文件格式:CSV(Comma-Separated Values)是一种以纯文本形式存储数据的文件格式。每一行是一条记录,记录中的字段使用逗号进行分隔。可以使用Excel等工具打开并进行管理。

2.SQLite数据库:SQLite是一种轻型的关系型数据库管理系统,它不需要独立的服务器进程,以文件形式存储数据。可以使用SQL语句来对数据进行操作,也可以使用现成的库进行管理。

3.JSON文件格式:JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,可以使用多种编程语言进行解析和生成。可以将曲线数据转化为JSON格式,并存储在文件中。

4.XML文件格式:XML(Extensible Markup Language)是一种标记语言,用于存储和传输结构化数据。可以将曲线数据转化为XML格式,并存储在文件中。

无论使用哪种方式,建议先进行一些数据的预处理,例如去除冗余数据、去重、数据格式规范等。另外,可以考虑使用版本控制工具(如Git)来管理文件的修改历史,便于回溯和恢复。

我这些曲线大约有0-100条,用列表显示出来,方便查询删除等管理,所以如果用二进制方式存储的话,能否存储在一个文件里?每条曲线坐标点数在500到1000个坐标点的样子,长短不一要如何读写呢?

建议用Json,xml这些序列化工具
担心加载查找慢,可以建立索引,分成多个文件,每个文件保存若干条曲线,配合多线程
最求更高效率再用二进制,字节对齐加速等等