2016-07-14 12 views
0

Meine Aufgabe ist es, ein kleines Programm in C++ zu erstellen, die Protokolle und Textdateien lädt und ihre Parameter mit ihren Werten trennt.Vektor von Strukturen mit Vektor der Ganzzahl

Die Struktur der Eingabedatei ist wie:

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

Und meine Aufgabe ausgegeben zu machen, die in cmd, wenn der Benutzer Schreib Namen eines Parameters angezeigt. So:

#CURRENT_OPTIMIZED_BVH_NODES 
210023 
210024 
210065 
210047 
265400 
.... 

sieht Ihr Programm wie dieses jetzt richtig. Ich habe zwei Probleme - ich habe keine Ahnung, wie man mit Vektoren arbeitet, aber ich brauche sie wegen dynamischer Arrays (Niemand weiß, wie viele verschiedene Parameter in der Datei sind und wie viele Werte ein einzelner Parameter hat) und dann wie man argc benutzt, argv für meine Ausgabe. ich viele gefunden haben, berät, aber nirgends war eine Praxis, dass ich für meinen Code verwenden:

#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; 
} 
+0

Ich denke, die allgemeine Struktur ist falsch. Sie müssen eine 'map' (prüfen Sie die C++ lib-Dokumentation) mit Schlüsseln als Parameternamen und Werten als Vektoren der gelesenen Werte erstellen. BTW Sie push_back etwas während der Iteration auf die Elemente ('Parameter.push_back (ParStruct())'). Klingt falsch. –

+1

Was fragst du? Warum hast du dies markiert [tag: c]? –

+0

@ Jean-FrançoisFabre Nun ja, es klingt falsch, aber es funktioniert perfekt. Ich muss immer nur ein neues Array mit NULL-Werten erstellen und genau das (Parameter.push_back (ParStruct())) mache es. Frag mich nicht warum, ich bin ein Anfänger: D – M4rty32

Antwort

0

Ok, habe ich es, hier mein ganzes Programm ist und es funktioniert perfekt.

#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; 
}