⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileio.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,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(&regdata,sizeof(RAINFALLDATA),1,fp);
			        }
			        else
			        {  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -