📄 fileio.cpp
字号:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#include <bios.h>
#include "fileio.h"
#include "macrodef.h"
#include "etr232i.h"
//////////////////////////for keypad
#include "keymenu.h"
extern RAINFALLDATA OutRainfallregdata;
extern WATERLEVELDATA OutWaterLevelregdata;
//保存水位数据
int SaveWaterLevelData( char *FileName, char *WaterLevel, char *SaveTime, char datatype )
{
int i, j, len;
static FILE *fp = NULL;
WATERLEVELDATA regdata;
WATERLEVELHEAD WaterFileHead={WATER_HEAD, WATER_REC, WATER_REC, WATER_REC};
struct time t;
struct date d;
if(fp!=NULL) fclose(fp);
if((fp=fopen(FileName,"rb"))==NULL)
{
if((fp=fopen(FileName,"ab+"))==NULL) /*若文件存在以追加模式打开*/
{
if(GetKPState==LOCK) printf("\t>>Cannot save %s file!\n", FileName);
///////////////////////////
//此处可以加告警处理程序
///////////////////////////
return -1;
}
fwrite(&WaterFileHead,sizeof(WATERLEVELHEAD),1,fp);
}
rewind(fp);
fread(&WaterFileHead,sizeof(WATERLEVELHEAD),1,fp);
fclose(fp);
fp=fopen(FileName,"ab+");
//strcpy( regdata.time, SaveTime );
/*getdate( &d ); //取系统的时间
gettime( &t );
regdata.time[0] = d.da_year-2000; //把当前年的值赋值给time成员的第1个元素
regdata.time[1] = d.da_mon; //把当前月的值赋值给time成员的第2个元素
regdata.time[2] = d.da_day; //把当前天的值赋值给time成员的第3个元素
regdata.time[3] = t.ti_hour; //把当前小时的值赋值给time成员的第4个元素
regdata.time[4] = t.ti_min; //把当前分钟的值赋值给time成员的第5个元素
regdata.time[5] = '\0'; //把字符串结束符的值赋值给time成员的第6个元素*/
for(j=0; j<6; j++ )
regdata.time[j] = SaveTime[j];
strcpy(regdata.water_level, WaterLevel); //把当前水位的值赋给regdata结构体变量的water_level成员
len = strlen(regdata.water_level);
for(i=len; i<6; i++)
regdata.water_level[i]='\0';
regdata.datatype= datatype;
regdata.cr_lf = 0x0a;
fseek(fp,WaterFileHead.end_report,0);
fwrite(®data,sizeof(WATERLEVELDATA),1,fp); // 把时间和水位数据存入指定的文件中
fclose(fp);
WaterFileHead.end_report+=WATER_REC;
fp=fopen(FileName,"rb+");
fseek(fp,10,0);
fwrite(&WaterFileHead.end_report, 4, 1, fp);
fclose(fp); /*关闭文件*/
return 1;
}
//保存降雨量数据
int SaveRainfallData( char *FileName, char *Rainfall, char *SaveTime, int GatherIvTime,char datatype )
{
int i, j, len;
static FILE *fp = NULL;
RAINFALLDATA regdata;
RAINFALLHEAD RainFileHead={RAINFALL_HEAD, RAINFALL_REC, RAINFALL_REC, RAINFALL_REC};
struct time t;
struct date d;
if(fp!=NULL) fclose(fp);
if((fp=fopen(FileName,"rb"))==NULL)
{
if ((fp=fopen(FileName,"ab+"))==NULL) /*否则以写模式打开*/
{
if(GetKPState==LOCK) printf("\t>>Cannot save %s file!\n", FileName);
///////////////////////////
//此处可以加告警处理程序
///////////////////////////
return -1;
}
fwrite(&RainFileHead,sizeof(RAINFALLHEAD),1,fp);
}
rewind(fp);
fread(&RainFileHead,sizeof(RAINFALLHEAD),1,fp);
fclose(fp);
fp=fopen(FileName,"ab+");
//strcpy( regdata.time, SaveTime );
/*regdata.time[0] = d.da_year-2000; //把当前年的值赋值给time成员的第1个元素
regdata.time[1] = d.da_mon; //把当前月的值赋值给time成员的第2个元素
regdata.time[2] = d.da_day; //把当前天的值赋值给time成员的第3个元素
regdata.time[3] = t.ti_hour; //把当前小时的值赋值给time成员的第4个元素
regdata.time[4] = t.ti_min; //把当前分钟的值赋值给time成员的第5个元素
regdata.time[5] = '\0'; //把字符串结束符的值赋值给time成员的第6个元素*/
for(j=0; j<6; j++ )
regdata.time[j] = SaveTime[j];
strcpy(regdata.rainfall, Rainfall); //把当前雨量的值赋给regdata结构体变量的rainfall成员
len = strlen(regdata.rainfall);
for(i=len; i<6; i++)
regdata.rainfall[i]='\0';
regdata.type_of_Ivtime = GatherIvTime; //记录雨量的采集间隔时间
regdata.datatype= datatype;
regdata.cr_lf = 0x0a;
fseek(fp,RainFileHead.end_report,0);
fwrite(®data,sizeof(RAINFALLDATA),1,fp); // 把时间和水位数据存入指定的文件中
fclose(fp);
RainFileHead.end_report+=RAINFALL_REC;
fp=fopen(FileName,"rb+");
fseek(fp,12,0);
fwrite(&RainFileHead.end_report, 4, 1, fp);
fclose(fp); /*关闭文件*/
return 1;
}
//读记录的水位数据
int ReadWaterLevelData( char *FileName, int Center )
{
int j;
static FILE *fp = NULL;
WATERLEVELDATA regdata;
WATERLEVELHEAD WaterFileHead={WATER_HEAD, WATER_REC, WATER_REC, WATER_REC};
if(fp!=NULL) fclose(fp);
if((fp=fopen(FileName,"rb+"))==NULL) /*以读写方式打开一个二进制文件*/
{
if(GetKPState==LOCK) printf("\t>>Cannot read %s file!\n",FileName);
fclose(fp); /*关闭文件*/
return -1;
}
fseek(fp,0,2); //将文件的位置指针移到文件的末尾
if (ftell(fp)>=WATER_REC) /*文件不空*/
{
rewind(fp); //使文件的位置指针重新返回文件的开头
fread(&WaterFileHead,sizeof(WATERLEVELHEAD),1,fp);
if(Center==1)
{
while(WaterFileHead.end_report-WATER_REC>=WaterFileHead.start1_report)
{
fseek(fp,WaterFileHead.start1_report,0);
fread(®data,sizeof(WATERLEVELDATA),1,fp);
if ((regdata.time[5]!=0)||(regdata.water_level[5]!=0)||(regdata.cr_lf!=0x0a))
{
WaterFileHead.start1_report++;
fseek(fp,WaterFileHead.start1_report,0);
fread(®data,sizeof(WATERLEVELDATA),1,fp);
}
else
{
break;
}
}
if(WaterFileHead.start1_report>(WaterFileHead.end_report-WATER_REC)) //没有需要发送的数据
{
fclose(fp);
return -2;
}
for(j=0; j<6; j++)
OutWaterLevelregdata.time[j] = regdata.time[j];
strcpy(OutWaterLevelregdata.water_level, regdata.water_level);
OutWaterLevelregdata.datatype = regdata.datatype;
WaterFileHead.start1_report+=WATER_REC;
fseek(fp, 2, 0);
fwrite(&WaterFileHead.start1_report,4,1,fp);
}
else
{
while(WaterFileHead.end_report-WATER_REC>=WaterFileHead.start2_report)
{
fseek(fp,WaterFileHead.start2_report,0);
fread(®data,sizeof(WATERLEVELDATA),1,fp);
if ((regdata.time[5]!=0)||(regdata.water_level[5]!=0)||(regdata.cr_lf!=0x0a))
{
WaterFileHead.start2_report++;
fseek(fp,WaterFileHead.start2_report,0);
fread(®data,sizeof(WATERLEVELDATA),1,fp);
}
else
{
break;
}
}
if(WaterFileHead.start2_report>(WaterFileHead.end_report-WATER_REC)) //没有需要发送的数据
{
fclose(fp);
return -2;
}
for(j=0; j<6; j++)
OutWaterLevelregdata.time[j] = regdata.time[j];
strcpy(OutWaterLevelregdata.water_level, regdata.water_level);
OutWaterLevelregdata.datatype = regdata.datatype;
WaterFileHead.start2_report+=WATER_REC;
fseek(fp, 6, 0);
fwrite(&WaterFileHead.start2_report,4,1,fp);
}
}
else /*非法文件*/
{
fclose(fp);
remove(FileName);
if(GetKPState==LOCK) printf("remove %s file!\n", FileName);
return -2;
}
fclose(fp); /*关闭文件*/
return 0;
}
//读记录的雨量数据
int ReadRainfallData( char *FileName, int Center )
{
int j;
static FILE *fp = NULL;
RAINFALLDATA regdata;
RAINFALLHEAD RainFileHead={RAINFALL_HEAD, RAINFALL_REC, RAINFALL_REC, RAINFALL_REC};
if(fp!=NULL) fclose(fp);
if ((fp=fopen(FileName,"rb+"))==NULL) /*以读写方式打开一个二进制文件*/
{
if(GetKPState==LOCK) printf("\t>>Cannot read %s file!\n", FileName);
fclose(fp); /*关闭文件*/
return -1;
}
fseek(fp,0,2); //将文件的位置指针移到文件的末尾
if (ftell(fp)>=RAINFALL_REC) /*文件不空*/
{
rewind(fp); //使文件的位置指针重新返回文件的开头
fread(&RainFileHead,sizeof(RAINFALLHEAD),1,fp);
if(Center==1)
{
while(RainFileHead.end_report-RAINFALL_REC>=RainFileHead.start1_report)
{
fseek(fp,RainFileHead.start1_report,0);
fread(®data,sizeof(RAINFALLDATA),1,fp);
if ((regdata.time[5]!=0)||(regdata.rainfall[5]!=0)||(regdata.cr_lf!=0x0a))
{
RainFileHead.start1_report++;
fseek(fp,RainFileHead.start1_report,0);
fread(®data,sizeof(RAINFALLDATA),1,fp);
}
else
{
//fclose(fp);
//remove(FileName);
break;
}
}
if(RainFileHead.start1_report>(RainFileHead.end_report-RAINFALL_REC)) //没有需要发送的数据
{
fclose(fp);
return -2;
}
for(j=0; j<6; j++)
OutRainfallregdata.time[j] = regdata.time[j];
strcpy(OutRainfallregdata.rainfall, regdata.rainfall);
OutRainfallregdata.type_of_Ivtime = regdata.type_of_Ivtime;
OutRainfallregdata.datatype = regdata.datatype;
RainFileHead.start1_report+=RAINFALL_REC;
fseek(fp, 4, 0);
fwrite(&RainFileHead.start1_report,4,1,fp);
}
else
{
while(RainFileHead.end_report-RAINFALL_REC>=RainFileHead.start2_report)
{
fseek(fp,RainFileHead.start2_report,0);
fread(®data,sizeof(RAINFALLDATA),1,fp);
if ((regdata.time[5]!=0)||(regdata.rainfall[5]!=0)||(regdata.cr_lf!=0x0a))
{
RainFileHead.start2_report++;
fseek(fp,RainFileHead.start2_report,0);
fread(®data,sizeof(RAINFALLDATA),1,fp);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -