#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <Windows.h>
typedef struct _CodeData
{
char Signal[20];//最前面的特殊标识符.最大支持20个字符标识符
int Serial_Number;//序号
char Signal01[20];//标识符
int Signal01_Data;//标识符后的数据
char Signal02[20];//标识符
int Signal02_Data;//标识符后的数据
char Signal03[20];//标识符
int Signal03_Data;//标识符后的数据
//后面数据可以根据自己的需要不断的累加
}CodeData, * PCodeData;
int WriteStruct(char* tFilePath, PCodeData tObj,
unsigned int tElementCount//结构体对象数量
)//向文件写数据
{
FILE* fp = fopen(tFilePath, "w");
if (!fp)
{
perror("file open fail");
return -1;
}
fwrite(tObj, sizeof(tObj[0]), tElementCount, fp);
fclose(fp);
return 0;
}
int ReadStruct(char* tFilePath)//从文件读数据
{
int mData_RowsNumber = 0;//文件内数据行数
struct _CodeData* mObj = malloc(sizeof(CodeData));//默认分配一个堆区,与下面fread(mObj, 1, sizeof(mObj[0]), fp);第二个形参每次读取一次相对应
if (!mObj)
{
perror("malloc fail");
return -1;
}
FILE* fp = fopen(tFilePath, "r+");
if (!fp)
{
perror("file open fail");
return -1;
}
while (1)
{
fread(mObj, 1, sizeof(mObj[0]), fp);
if (feof(fp))
{
break;
}
mData_RowsNumber++;
free(mObj);
mObj = malloc(sizeof(CodeData) * mData_RowsNumber);//充分利用堆区空间
if (!mObj)
{
perror("malloc fail");
return -1;
}
}
rewind(fp);
fread(mObj, sizeof(mObj[0]), mData_RowsNumber, fp);
for (size_t i = 0; i < mData_RowsNumber; i++)
{
printf("%s%d\t%s %d\t%s %d\t%s %d\t\n", (mObj + i)->Signal, (mObj + i)->Serial_Number, (mObj + i)->Signal01, (mObj + i)->Signal01_Data, (mObj + i)->Signal02, (mObj + i)->Signal02_Data, (mObj + i)->Signal03, (mObj + i)->Signal03_Data);
}
fclose(fp);
free(mObj);
return 0;
}
int main(void)
{
char* mFilePath = "01-源.txt";
struct _CodeData mObj[4] = {
"G", 01, "X", 10, "Y", 20, "Z", 50,
"G", 03, "X", 20, "Y", 50, "Z", 80,
"G", 01, "X", 30, "Y", 100, "Z", 200,
"G", 02, "X", 40, "Y", 200, "Z", 500,
};
WriteStruct(mFilePath, mObj, sizeof(mObj) / sizeof(mObj[0]));
ReadStruct(mFilePath);
return EXIT_SUCCESS;
}
程序运行结果。