从文本文件计算

Calculations from Text Files

本文关键字:计算 文件 文本      更新时间:2023-10-16

我有一个包含如下值的文本文件:

2013 05 27 15 52 02.049824 231.401 0.022 49.738  2013 05 27 15 52 02.668822 229.814 0.019 49.738  2013 05 27 15 52 03.283705 228.528 2.599 49.726  2013 05 27 15 52 03.898469 230.140 2.576 49.751
列 1 = 日期,列 2 = 月,列 3 = 天,列 4 = 小时,列 5 = 分钟,列

6 = 秒,列 7 = 电压(vrms),列 8 = 当前(irms),列 9 = 频率(Hz)。

我必须开发一个程序来分析24小时内这些时间采样的电压和电流测量值,并找到24小时内每小时使用的总能量,平均和峰值功耗以及使用的能量。

我该怎么做?
我还必须包括至少一种数值积分技术。
文件数据包含上述格式的 50,000 多行。

如何输入数据?这就是我尝试过的。

using namespace std;
class DataTable{  
    public:   
        int year;   
        int month;  
        int day;   
        int hour;   
        int minute;   
        double seconds;   
        double voltage;   
        double current;   
        double frequency;   
};

int main(){  
    DataTable Data;
    ifstream DataFile("Data.txt");
    if (!DataFile)
        cout << "Unable to open" << endl;
        int year1, month1, day1, hour1, minute1;
        double seconds1, voltage1, current1, frequency1;
        while(DataFile >> year1 >> month1 >> day1 >> hour1 >> minute1 >> seconds1 >> voltage1 >> current1 >> frequency1)
        {
            Data.year = year1;
            Data.month = month1;
            Data.day = day1;
            Data.hour = hour1;
            Data.minute = minute1;
            Data.seconds = seconds1;
            Data.voltage = voltage1;
            Data.current = current1;
            Data.frequency = frequency1;
        }
    return 0;
}

如何输入数据?

您希望有一个std::vector<DataTable>,您可以在其中存储填充在 while 循环中的Data实例的副本:

int main() {  
    ifstream DataFile("Data.txt");
    if (!DataFile) {
        cout << "Unable to open" << endl;
        return -1;
    }
    int year1, month1, day1, hour1, minute1;
    double seconds1, voltage1, current1, frequency1;
    std::vector<DataTable> records;
    while(DataFile >> year1 >> month1 >> day1 >> hour1 >> minute1 >> seconds1 >>
                      voltage1 >> current1 >> frequency1) {
        DataTable Data;
        Data.year = year1;
        Data.month = month1;
        Data.day = day1;
        Data.hour = hour1;
        Data.minute = minute1;
        Data.seconds = seconds1;
        Data.voltage = voltage1;
        Data.current = current1;
        Data.frequency = frequency1;
        records.push_back(Data);
    }
    // Do something with records ...
    return 0;
}

另一种选择是为结构重载operator>>

class DataTable{  
    public:   
        friend std::istream& operator>>(std::istream& inp, DataTable& dt);
        int year;   
        int month;  
        int day;   
        int hour;   
        int minute;   
        double seconds;   
        double voltage;   
        double current;   
        double frequency;   
};
std::istream& operator>>(std::istream& inp, DataTable& dt)
{
    inp >> year;
    inp >> month;
    inp >> day;
    inp >> hour;
    inp >> minute;
    inp >> seconds;
    inp >> voltage;
    inp >> current;
    inp >> frequency;
    return inp;
};

您的输入循环将如下所示:

std::vector<DataTable> data;
DataTable dt;
while (DataFile >> dt)
{
  data.push_back(dt);
}

这种范式的一个优点是数据结构可以在不影响输入循环的情况下更改。