需求说明:给定nav格式的北斗时文件从中提取出北斗周和周内秒信息,将该信息转化为日历时
软件界面:
设计流程:
1. 变量定义:
批量处理: 打开,btn_openFile; 转换, btn_timeTrans
单一转换:北斗周对应文本框,txb_bdsWeek;周内秒对应的文本框:txb_weekInnerSec;转换结果对应的文本框,txb_resault;转换按钮:btn_singleTrans;清空按钮,btn_clear
2. 界面设计
将对话框的最大化按钮设为False的两种方式:
1)在 InitializeComponent()函数中手写代码:this.MaximizeBox = false;
2)在属性MaximizeBox设为false
将对话框设置为大小不可调整:属性FormBorderStyle设为FixedDialog
3. 代码实现
3.1 批量处理-->打开按钮
private void btn_openFile_Click(object sender, EventArgs e) { //弹出文件对话框 OpenFileDialog ofd = new OpenFileDialog(); ofd.ShowDialog(); txtPath = ofd.FileName; if (txtPath.Split('.')[1] != "nav") { MessageBox.Show("打开文件应为nav格式文件,请重新选择打开", "错误提示"); } }
3.2 批量处理-->转换
private void btn_timeTrans_Click(object sender, EventArgs e) { if (txtPath == null) { MessageBox.Show("请点击 打开 按钮,选择要转换的文件", "错误提示"); return; } string outputFilePath = txtPath.Split('.')[0] + ".bds"; System.IO.StreamWriter file = new System.IO.StreamWriter(outputFilePath, false); file.Write("北斗周 周内秒 年 月 日 时 分 秒\r\n"); //打开文件开始转换 System.IO.StreamReader inputFile = System.IO.File.OpenText(txtPath); string nextLine; while ((nextLine = inputFile.ReadLine()) != null) { string[] substrtmp = nextLine.Split(';'); string[] substrs = substrtmp[1].Split(','); //得到北斗周和周内秒 int bdsWeek = int.Parse(substrs[0]); double weekInnerSec = double.Parse(substrs[1]); CalendarTime ct = gps2CalendarTime(bdsWeek, weekInnerSec); file.Write("{0:D} {1:N} {2:D} {3:D} {4:D} {5:D} {6:D} {7:N}\r\n", bdsWeek, weekInnerSec, ct.year, ct.month, ct.day, ct.hour, ct.minus, ct.second); } //关闭文件 file.Close(); //释放对象 inputFile.Dispose(); file.Dispose(); MessageBox.Show("输出路径为:" + outputFilePath, "转换成功"); }
3.3 北斗时到日历时转换函数
private CalendarTime gps2CalendarTime(int weekno, double gpstow) { CalendarTime ct = new CalendarTime(); int[] dinmth={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; double isecs = gpstow; double fsec = gpstow - isecs; int dayofw = (int)(isecs / 86400); isecs = isecs - 86400 * dayofw; int h = (int)(isecs / 3600); isecs = isecs - 3600 * h; int m = (int)(isecs / 60); double s = isecs - 60 * m + fsec; //输出时分秒 ct.hour = h; ct.minus = m; ct.second = s; int ttlday = dayofw + 7 * weekno; ttlday -= 360; int yr = 1981; while(ttlday > 366) { ttlday = ttlday - 365; if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) { ttlday -= 1; } yr++; } if (ttlday == 366) { if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) { ct.year = yr; dayofw = 366; } else { ct.year = yr + 1; dayofw = 1; } } if (ttlday < 366) { ct.year = yr; dayofw = ttlday; } int mon = 0; foreach (int i in dinmth) { mon += 1; if (ttlday <= i && ttlday > 0) { ct.day = ttlday; ct.month = mon; ttlday = 0; } else if (mon == 2) { if (yr % 4 == 0 && yr % 100 != 0 || yr % 400 == 0) { if (ttlday > 29) { ttlday -= 29; } else { ct.day = 29; ct.month = 2; ttlday = 0; } } else { ttlday -= 28; } } else { ttlday -= dinmth[mon]; } if (ttlday == 0) break; } return ct; }
3.4 单一处理-->转换
private void btn_ouputFile_Click(object sender, EventArgs e) { int bdsWeek = int.Parse(txb_bdsWeek.Text); double weekInnerSec = double.Parse(txb_weekInnerSec.Text); CalendarTime ct = gps2CalendarTime(bdsWeek, weekInnerSec); txb_resault.Text = string.Format("{0:D} {1:D} {2:D} {3:D} {4:D} {5:N}", ct.year, ct.month, ct.day, ct.hour, ct.minus, ct.second); }
3.5 单一处理-->清除
private void btn_clear_Click(object sender, EventArgs e) { txb_weekInnerSec.Text = null; txb_resault.Text = null; txb_bdsWeek.Text = null; }
4 抛砖引玉
对行数较多的大文件报如下错,还请高手指点