📄 exm12022_1.cpp
字号:
#include <stdio.h> //用于标准I/O程序定义和申明的头文件
#include "mat.h" //定义MAT文件接入和创建方法的头文件
#include <string.h> //用于串操作函数申明的头文件
#define BUFSIZE 255 //定义缓冲器的最大字节数255
//--------------------------子函数create--------------------------------
int create(const char *file)
{
//变量定义及初始化
MATFile *pmat; //为MAT文件定义指针
mxArray *pa1, *pa2, *pa3; //定义结构体的指针
double data[9] = { 1.0, 4.0, 7.0, 2.0, 5.0, 8.0, 3.0, 6.0, 9.0 }; //定义双精度变量
char str[BUFSIZE]; //定义字符串
printf("Creating file %s...\n\n", file); //以标准C格式输出MAT文件名file
pmat = matOpen(file, "w"); //以“写”模式打开名为file的MAT文件
//“写”模式会删除那文件中可能存在的原内容,并返回文件句柄pmat
if (pmat == NULL) //matOpen的成功执行将返回非NULL
{
printf("Error creating file %s\n", file);
printf("(do you have write permission in this directory?)\n");
return(1); //返回1,表示开启失败。
}
pa1 = mxCreateDoubleMatrix(3,3,mxREAL); //令pa1为所创(3′3)双精度实矩阵的指针
mxSetClassName(pa1, "LocalDouble"); //把pa1所指结构体起名为LocalDouble
pa2 = mxCreateDoubleMatrix(3,3,mxREAL);
mxSetClassName(pa2, "GlobalDouble"); //把pa2所指结构体起名为GlobalDouble
memcpy((void *)(mxGetPr(pa2)), (void *)data, sizeof(data));
//把data源缓冲区中内容复制到pa2所指mxArray实部的目标缓冲区中
//待复制的字节数为data 的全部字节
pa3 = mxCreateString("MATLAB: the language of technical computing");
//令pa3为所创字符串的指针
mxSetClassName(pa3, "LocalString"); //把pa3所指结构体起名为LocalString
matPutVariable(pmat, "LocalDouble", pa1); //把pa1所指结构体写入pmat所指MAT文件
matPutVariableAsGlobal(pmat, "GlobalDouble", pa2);
//把pa2所指的结构体以“全局变量”身份写入pmat所指MAT文件
matPutVariable(pmat, "LocalString", pa3);
//经过以上操作,pa1所指的LocalDouble变量将是(3′3)的全0数组
//以下两行指令再把data 源缓冲器中数据复盖在pa1所指mxArray的全0实部上
//这样的程序设计是“故意”的,是为了表现可覆盖性。
memcpy((void *)(mxGetPr(pa1)), (void *)data, sizeof(data));
matPutVariable(pmat, "LocalDouble", pa1);
mxDestroyArray(pa1); //释放被mxCreate配置过的pa1所指动态内存
mxDestroyArray(pa2); //释放被mxCreate配置过的pa2所指动态内存
mxDestroyArray(pa3); //释放被mxCreate配置过的pa3所指动态内存
if (matClose(pmat) != 0) //matClose关闭pmat所指文件成功,返回0;否则为1。
{
printf("Error closing file %s\n",file);
return(1);
}
//…….以下再次打开刚写入的MAT文件,并用mxGetArray对写入内容加以验证……..
pmat = matOpen(file, "r"); //以“读”模式打开pmat所指的名为file的MAT文件
if (pmat == NULL) //matOpen的成功开启,将返回非NULL。
{
printf("Error reopening file %s\n", file);
return(1);
}
pa1 = matGetVariable(pmat, "LocalDouble");
//从pmat所指MAT文件中读出名为LocalDouble的结构体,并设指针为pa1。
if (pa1 == NULL) //检查读出操作是否成功
{
printf("Error reading existing matrix LocalDouble\n");
return(1);
}
if (mxGetNumberOfDimensions(pa1) != 2) //检查pa1所指结构体是否2维
{
printf("Error saving matrix: result does not have two dimensions\n");
return(1);
}
pa2 = matGetVariable(pmat, "GlobalDouble");
//从pmat所指MAT文件中读出名为GlobalDouble的结构体,并设指针为pa2。
if (pa2 == NULL)
{
printf("Error reading existing matrix GlobalDouble\n");
return(1);
}
if (!(mxIsFromGlobalWS(pa2))) //检查pa2是否全局变量
{
printf("Error saving global matrix: result is not global\n");
return(1);
}
pa3 = matGetVariable(pmat, "LocalString");
//从pmat所指MAT文件中读出名为LocalString的结构体,并设指针为pa3。
if (pa3 == NULL)
{
printf("Error reading existing matrix LocalString\n");
return(1);
}
mxGetString(pa3, str, 255); //把pa3所指串结构体以C格式复制到str所指的内存中
//被复制的字符数不得多于(255-1)
if (strcmp(str, "MATLAB: the language of technical computing"))
//检查str中字符是否与 "MATLAB: the language of technical computing"相同
{
printf("Error saving string: result has incorrect contents\n");
return(1);
}
mxDestroyArray(pa1); //释放被mxCreate配置过的pa1所指动态内存
mxDestroyArray(pa2);
mxDestroyArray(pa3);
if (matClose(pmat) != 0)
{
printf("Error closing file %s\n",file);
return(1);
}
printf("Done\n"); //显示“整个子函数运行成功结束”
return(0); //返回“成功结束”的数值标志0
}
//--------------------------主程序-------------------------------
int main()
{
int result;
result = create("mattest.mat"); //调用子程序create创建数据文件mattest.mat
return (result==0)?EXIT_SUCCESS:EXIT_FAILURE;
//子程序成功执行返回0,并显示出“成功指型”的提示。
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -