从.txt文件MFC C ++开始读取特定行

时间:2014-01-13 01:51:38

标签: c++ mfc

我正在尝试从文本文件中的特定行读取。例如,文本文件中的行不相同。

INFO 2013-12-18 00:00:06,331 Thread-3 2032 CommonMMC.request_hardware_state() - Common 4 State = PASS (warn=False,fail=False)
INFO 2013-12-18 00:00:06,331 Thread-3 2032 request_cooling_system_status -> WARN (took 4.11000013351s)
INFO 2013-12-18 00:00:08,674 Thread-8 544 request_status_for_unit -> ({'FanSh7_2': 'Pass', 'State': 'Active', 'PDU_Internal': 'Pass', 'FanSh5_2': 'Pass', 'AirTemp': 'Pass', 'FanSh5_1': 'Pass', 'SecondaryWaterTemp': 'Pass', 'FanSh2_1': 'Pass', 'LowWaterLevel': 'Pass', 'FanSh2_2': 'Pass', 'FanSh3_1': 'Pass', 'FanSh3_2': 'Pass', 'DifferentialPumpPressure': 'Pass', 'PostPumpPressure': 'Pass', 'FanSh1_2': 'Pass', 'FanSh6_1': 'Pass', 'FanSh1_1': 'Pass', 'FanSh7_1': 'Pass', 'WaterPump': 'Pass', 'FanSh4_2': 'Pass', 'FanSh4_1': 'Pass', 'FanSh6_2': 'Pass', 'HighWaterLevel': 'Pass', 'PrePumpPressure': 'Pass', 'UnitNumber': 2, 'WaterValve': 'Pass'}, {'AirTemp_upper': 208, 'Current': 180, 'PrimaryWaterTempHexOut': -9999, 'ValveDmd': 92, 'PDU_Internal': 0, 'Target': 180, 'FanSh5_2': 3863, 'AirTemp': 205, 'FanSh5_1': 4185, 'SecondaryWaterTempReturn': -9999, 'FanSh2_1': 3995, 'FanSh2_2': 4185, 'SecondaryWaterTempFlow': 180, 'FanSh3_1': 3906, 'FanSh3_2': 4185, 'WaterValvePosition': 92, 'DifferentialPumpPressure': 940, 'FirmwareVersion': '01.36', 'PostPumpPressure': 2347, 'kD': 0, 'FanSh6_1': 3906, 'kI': 9220, 'FanSh1_2': 4235, 'FanSh1_1': 3906, 'ValveIndex': 92, 'WaterTempSensorFlow': 'OmegaTH1044006', 'kP': 0, 'FanSh7_1': 4185, 'WaterPump': 'On', 'Error': 0, 'FanSh4_2': 4185, 'FanSh4_1': 3906, 'FanSh6_2': 4185, 'WaterValveEndStop': 'BetweenStops', 'FanSh7_2': 3906, 'SecondaryWaterTarg': 180, 'PrePumpPressure': 1407, 'UnitNumber': 2, 'PrimaryWaterTempHexIn': -9999}) (took 2.29699993134s)
INFO 2013-12-18 00:00:09,456 Thread-7 120 do_dc_channel_diagnostic -> {'Channel=28': 'SupplyOn', 'Channel=29': 'SupplyOn', 'Channel=22': 'SupplyOn', 'Channel=23': 'SupplyOn', 'Channel=20': 'SupplyOn', 'Channel=21': 'SupplyOn', 'Channel=26': 'SupplyOn', 'Channel=27': 'SupplyOn', 'Channel=24': 'SupplyOn', 'Channel=25': 'SupplyOn', 'Channel=9': 'SupplyOn', 'Channel=8': 'SupplyOff', 'Channel=3': 'SupplyOn', 'Channel=2': 'SupplyOn', 'Channel=1': 'SupplyOn', 'Channel=0': 'SupplyOn', 'Channel=7': 'SupplyOn', 'Channel=6': 'SupplyOff', 'Channel=5': 'SupplyOff', 'Channel=4': 'SupplyOff', 'Channel=33': 'SupplyOn', 'Channel=13': 'SupplyOn', 'Channel=12': 'SupplyOn', 'Channel=11': 'SupplyOff', 'Channel=10': 'SupplyOpenCircuit', 'Channel=17': 'SupplyOn', 'Channel=16': 'SupplyOn', 'Channel=15': 'SupplyOn', 'Channel=14': 'SupplyOn', 'Channel=31': 'SupplyOn', 'Channel=30': 'SupplyOn', 'Channel=19': 'SupplyOn', 'Channel=18': 'SupplyOn', 'Channel=32': 'SupplyOn'} (took 2.82800006866s)

项目背景:

我的解析器实用程序应该转到此文本文件,该文件每隔几秒钟不断更新,并按照用户指定的频率从那里解析文本,例如,5分钟,10分钟,15分钟等等。

我现在面临的问题是程序的第一次运行,因为用户可能在下午5点05分以15分钟的间隔启动程序。我已经让程序足够智能,让计时器在最近的一小时开始,在这种情况下将是 5.15pm

/////首先运行////

我的程序应该递归检查每个文本行中的时间,直到它发现时间相同或更晚,并从那里开始运行直到第一次运行的EOF。我已经设法通过一些CTime函数和CString来搜索并获得正确的时间。

SYSTEMTIME st;
GetLocalTime(&st);
CString mill;
mill.Format("%02d", st.wMinute);
mill2.Format("%02d:%02d", st.wHour, st.wMinute);
First_Minute = atoi(mill);

这是在开始时定义的。原因是我想首先检查文本行中的小时和分钟是否相同(因为它每隔几秒更新一次),然后只检查我转换为int的第一分钟。

接下来的几个代码是我的比较方法,它将第一分钟与文本行进行比较

INFO 2013-12-18 00:00:00,299 Thread-3 2032 CommonMMC.request_hardware_state() - Common 4 State = PASS (warn=False,fail=False)

比较代码

while ((result = fscanf(readLOG_fp, "%[^\n]\n", ReadLogLine)) != EOF) // Loops through the file till it reaches the end of file
{
    CString CurrLine = ReadLogLine;
    Cstring CurrLine_Check = CurrLine;       

    if (first_run)
    {
        int n = CurrLine_Check.Find(mill2);

        if (n == 16)
        {
            int a = CurrLine_Check.GetLength();
            CurrLine_Check.Delete(24, (a-24));
            CurrLine_Check.Delete(0, 22);
            int b = atoi(CurrLine_Check);

            if (First_Minute >= b)
            {
                    Sort_Array();
            }
        }
    }
if (first_run == false)
    {
        Sort_Array();
    }
}
fclose(readLOG_fp);
first_run = false;

基本上它的作用是从当前行检查mill2实例,该实例已定义为“%02d:%02d”,并与文本行进行比较。找到之后,将另一个if循环置于内部以检查我已转换的分钟以及int。

如果第一分钟(在程序开始时定义)大于等于从文本行检查的分钟,它将运行sort_array函数。

我的问题是我希望程序运行到EOF时它碰到if循环。有没有办法从指定的行开始扫描,例如第10行?因为我想在if循环中放一个计数器。

我想在内部使用另一个while循环来循环它直到EOF,但这不会起作用,因为它仍将通过时间检查。

谢谢!我提前感谢你的帮助:)。

1 个答案:

答案 0 :(得分:0)

由于文件中的行长度不同,从某一行开始扫描的唯一方法是从头开始逐行读取。