vs2019读取和写入TXT文件数据,写入matlab文件用法,数据归一化
在读取大量数据的时候,经常会把数据存储在TXT文件里,然后让vs的程序读取,本文主要写了vs对TXT数据的读取和写入,以及写入MATLAB的.m文件。
一,读取TXT文件数据
首先要加上头文件 #include”fstream .h”(编辑的时候<>打不出来,就用了“fstream .h ”),表示程序包含fstream(文件流),然后才能读写。
(1)一个TXT文件存储一个类型的数据,就是说这个文件只有这一种数据。代码如下:
void data(){
double X[Data_number]={0};//Data_number代表数据的个数
double Y[Data_number]={0};
ifstream in1, in2;//从硬盘到内存
in1.open("E:\\shuju\\x2.txt");//在相应的路径中打开txt文件
in2.open("E:\\shuju\\y2.txt");
for (int i = 0; i < Data_number; i++)
{//按行读取文件,Data_number表示数据有多少行,一行一个数据
in1 >> X[i];
//cout << X[i] << endl;//可以在此输出数据,检查是否读取成功
}
for (int i = 0; i < Data_number; i++)
{//按行读取文件,Data_number表示数据有多少行,一行一个数据
in2 >> Y[i];
//cout << Y[i] << endl;
}
in1.close();//文件关闭
in2.close();//文件关闭
}
以上就实现了同时按行读取两个txt文件,一个文件存储的是x2的数据,另一个文件存储的是y2的数据,都有Data_number行的数据。
(2)一个TXT文件存储多个类型的数据。代码如下:
void data()
{
double X[Data_number]={0};//Data_number代表数据的个数
double Y[Data_number]={0};
double a[Data_number][2];//定义一个二维数组读取数据
ifstream in1, in2;
in1.open("E:\\shuju\\ans2.txt");
for (int i = 0; i < Data_number; i++)//按行
{
for (int j = 0; j < 2; j++)//共有2列,每列代表一种数据
{
in1 >> a[i][j];//按行按列读入数据
}
}
in1.close();//关闭文件,到这一步已经把数据读取到二维数组a中
//如果想要分开存储的话,只需按照下边的方法把每列的数据传给X和Y即可
for (int i = 0; i < Data_number; i++)
{
X[i] = a[i][0];
Y[i] = a[i][1];
}
}
以上就实现了同时按行读取一个文件ans2中的两种数据,每列代表一种数据,有Data_number行的数据。
二,写入TXT文件数据
同样,要加上头文件 #include”fstream .h”(编辑的时候<>打不出来,就用了“fstream .h ”),表示程序包含fstream(文件流),然后才能读写。
void indata()
{
double Code[line][column]={1};//需要存入的数据
ofstream input("E:\\data\\存入数据.txt");//存入数据名
for (int i = 0; i < line; i++)//行
{
for (int j = 0; j < column; j++)//列
{
input << Code[i][j] <<" ";
//将Code的数据存入TXT文件,此时应全是1
}
input <<endl;
}
input.close();
}
以上存储了数据到txt文件中。
三,vs写matlab的.m文件
FILE* f;//建立一个文件操作指针
errno_t err; //判断此文件流是否存在 存在返回1
err = fopen_s(&f, "E://GPUPSO.m", "w");//文件输出路径
//以下的代码是matlab的代码写法
fprintf(f, "clc;\nclear;\nhold on;\nbox on;\ngrid on;\n");
//输入语句,box,四周都有刻度,grid 打开网格
//绘制原始数据
fprintf(f, "X = [");//自变量原始
for (int i = 0; i < Data_number; i ++)
{
fprintf(f, "%f,", X[i]);//写入X的数据
}
fprintf(f, "];\n");
fprintf(f, "Fact=[");//因变量原始
for (int i = 0; i < Data_number; i ++)
{
fprintf(f, "%f,", Y[i]);//写入Y的数据
}
fprintf(f, "];\n");
fprintf(f, "plot(X,Y,'ko');\n");//画图
fprintf(p, "axis([0 120 0 1])");//横纵坐标范围
fclose(f);
f = nullptr;//防止野指针出现
以上就用vs来写入.m文件,可以在对应路径中找到文件并打开;其实写法和matlab语句类似(图中绿色的代码为在matlab的.m文件中的代码),只是加了开头和结尾,
四,归一化
需要头文件#include”algorithm.h”。
float Fact[Data_number]={“输入要归一化的数据” };
float dMaxValue = *max_element(Fact, Fact+Data_number); //求最大值
cout << "maxdata" << dMaxValue << '\n';
float dMinValue = *min_element(Fact, Fact+Data_number); //求最小值
cout << "mindata" << dMinValue << '\n';
for (int i = 0; i < Data_number; i++) {//归一化
Fact[i] = (ymax - ymin) * (Fact[i] - dMinValue) / (dMaxValue - dMinValue) + ymin;
cout << Fact[i] << ",";//输出归一化后的结果
}
以上仅为本人参考其他内容自己的理解,代码不可直接复制运行,因为文件路径,文件名,还有数据都要是自己用的。