简体   繁体   English

结构向量与整数向量

[英]Vector of structs with vector of integer

my task to do is to create a little programm in C++, which load logs and text files and separate their parameters with their values. 我的任务是在C ++中创建一个小程序,该程序将加载日志和文本文件,并将其参数与值分开。

The structure of input file is like: 输入文件的结构如下:

#CURRENT_OPTIMIZED_BVH_NODES
210023
#CURRENT_OPTIMIZED_BVH_COST
118.856
#CURRENT_OPTIMIZED_BVH_COST_RATIO
1
#ANIMATION_TIME
0.0321091
#REFIT_TIME
0.0411972
#UPDATE_TIME
0.000135373
#UPDATE_TIME_SUM
0.000135373
#BUILD_TIME_SUM
0.000135373
#UPDATE_REFIT_RATIO
0.00328597
...

And my task is to make output, that will appear in cmd when user write name of some parameter. 我的任务是制作输出,当用户写入某些参数的名称时,它将显示在cmd中。 Like this: 像这样:

#CURRENT_OPTIMIZED_BVH_NODES
210023
210024
210065
210047
265400
....

My program looks like this right now. 我的程序现在看起来像这样。 I have two problems - I have no idea how to work with vectors, but i need them because of dynamic arrays (Nobody know how many different parameter are in the file and also how many values single parameter has) and then how to use argc, argv for my output. 我有两个问题-我不知道如何使用向量,但是由于动态数组(没人知道文件中有多少个不同的参数,以及单个参数有多少个值),我又需要它们,然后如何使用argc, argv作为我的输出。 I have found many advises, but nowhere was a practise, that i could use for my code: 我发现了很多建议,但是没有一种实践可以用于我的代码:

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <vector>

using namespace std;

struct ParStruct
{
    string name;
    vector<double> value;
    double average;
    double min;
    double max;
    double median;

}; 

void WriteParameter(ParStruct Parameter, int SizeOfValueArr)
{
    cout << Parameter.name << endl;
    for (int i = 0; i < SizeOfValueArr; i++){
        cout << Parameter.value[i] << endl;;
    }
}


int main(int argc, char *argv[])
{

    vector <ParStruct> Parameter;
    Parameter.push_back(ParStruct());
    Parameter[0].value.push_back(double());



    string s = argv[0];
    argv[1];

    int LogNumber, LineNumber = 1, optionnumber;
    ifstream LogFile;

    double ParValue;

    string MemoryLog, options, fileline;

    string LogFilePath;

    cout << "Path: ";
    getline(cin, LogFilePath);

    LogFile.open(LogFilePath);

    while (LogFile.good()){

        while ((getline(LogFile, fileline)) && !(LogFile.eof())) {

            if (fileline[0] == '#'){ //Parameter
                MemoryLog = fileline;

                for (int i = 0; i < Parameter.size(); i++) {
                    if ((fileline != Parameter[i].name) && Parameter[i].name.size() < 2)    {
                        Parameter[i].name = fileline;
                    }
                    else
                    {
                        Parameter.push_back(ParStruct());
                        Parameter[i].name = fileline;
                    }

                }

            }
            else {
                istringstream Number(fileline);
                Number >> ParValue;

                for (int i = 0; i < Parameter.size(); i++) {
                    if (Parameter[i].name == MemoryLog) {
                        for (int m = 0; m < Parameter[i].value.size(); m++) {
                            if (Parameter[i].value[m] <= 0) {
                                Parameter[i].value[m] = ParValue;
                            }

                        }

                    }

                }

            }

        }

    }

    for (int i = 0; i < Parameter.size(); i++){
        WriteParameter(Parameter[i], Parameter[i].value.size());

    }

    LogFile.close();
    return 0;
}

Ok, I got it, here is my whole program and it works perfectly. 好的,我明白了,这是我的整个程序,它运行完美。

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

struct ParStruct
{
    string name;
    vector<double> value;
    double average;
    double min;
    double max;
    double median;

};

double average(ParStruct Parameter)
{
    double average = 0;

    for (int i = 0; i < Parameter.value.size(); i++){
        average += Parameter.value[i];

    }

    average = (average / Parameter.value.size());

    return average; 
};

double min(ParStruct Parameter){

    double min = Parameter.value[0];

    for (int i = 0; i < Parameter.value.size(); i++) {
        if (Parameter.value[i] <= min) {
            min = Parameter.value[i];
        }

    }


    return min;
};

double max(ParStruct Parameter){

    double max = Parameter.value[0];

    for (int i = 0; i < Parameter.value.size(); i++) {
        if (Parameter.value[i] >= max) {
            max = Parameter.value[i];
        }

    }


    return max;
};

double Median(ParStruct Parameter)
{
        int middle = (Parameter.value.size() / 2);

        double median;

        //sort numbers
        sort(Parameter.value.begin(), Parameter.value.end());

        //

        if (Parameter.value.size() % 2) {
            median = Parameter.value[middle];
        }
        else {
            median = (Parameter.value[middle] + Parameter.value[middle + 1]) / 2;
        }

        return median;
}

int main(int argc, char *argv[])
{

    vector <ParStruct> Parameter;
    Parameter.push_back(ParStruct());

    int LogNumber;
    ifstream LogFile;

    double ParValue;

    string MemoryLog, fileline;

    string LogFilePath;

    bool writtenName; 

    //

    // Check the number of parameters
    if (argc < 3) {
        // Tell the user how to run the program
        cerr << "Usage: <" << argv[0] << "> <Path to the file> <Parameter Name>" << endl;
        /* "Usage messages" are a conventional way of telling the user
        * how to run a program if they enter the command incorrectly.
        */
        return 1;
    }

    // Print the user's name:

    LogFile.open(argv[1]);

    if (!(LogFile.is_open())){

        cout << argv[1] << " File opening FAILED";
    }

    while (LogFile.good()) {

        while ((getline(LogFile, fileline)) && !(LogFile.eof())) {

            if (fileline[0] == '#'){ //Parameter
                MemoryLog = fileline;

                for (int i = 0; i < Parameter.size(); i++) {
                    if ((fileline != Parameter[i].name) && Parameter[i].name.size() < 2)    {
                        Parameter[i].name = fileline;
                        writtenName = true;
                    }
                    else if (fileline == Parameter[i].name)
                        break;

                }
                if (writtenName){
                    Parameter.push_back(ParStruct());
                    writtenName = false;
                }
            }
            else { //Number
                istringstream Number(fileline);
                Number >> ParValue;

                for (int i = 0; i < Parameter.size(); i++) {
                    if (Parameter[i].name == MemoryLog) {
                        Parameter[i].value.push_back(ParValue);
                    }

                }

            }

        }

    }

    for (int i = 0; i < Parameter.size() - 1; i++) {
        Parameter[i].average = average(Parameter[i]);
        Parameter[i].min = min(Parameter[i]);
        Parameter[i].max = max(Parameter[i]);
        Parameter[i].median = Median(Parameter[i]);
        //TO DO ANOTHER CALC
    }


    for (int i = 0; i < Parameter.size(); i++) {
        if (Parameter[i].name == argv[2]) {
            cout << "Parameter: " << Parameter[i].name << endl;
            cout << "AVERAGE: " << Parameter[i].average << endl;
            cout << "MIN: " << Parameter[i].min << endl;
            cout << "MAX: " << Parameter[i].max << endl;
            cout << "MEDIAN: " << Parameter[i].median << endl;
            cout << "SIZE: " << Parameter[i].value.size() << endl;
            for (int n = 0; n < Parameter[i].value.size(); n++)
            {
                cout << Parameter[i].value[n] << endl;
            }


        }

    }

    LogFile.close();
    cin.get();
    return 0;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM