2016-07-14 23 views
0

私の仕事は、ログとテキストファイルを読み込んでパラメータを値で区切るC++で小さなprogrammを作成することです。整数のベクトルを持つ構造体のベクトル

#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 
... 

そして、私の仕事は、いくつかのパラメータのユーザーの書き込み名CMDに表示される出力を、作ることです:

入力ファイルの構造は次のようです。 このように:

#CURRENT_OPTIMIZED_BVH_NODES 
210023 
210024 
210065 
210047 
265400 
.... 

私のプログラムは今のようになります。私は2つの問題があります - どのようにベクトルで作業するのか分かりませんが、私は動的配列のために必要です(ファイル内にいくつの異なるパラメータがあるか、また単一パラメータがいくつあるか知っている人はいません)私の出力のためのargv。 私がアドバイス多くのを発見したが、どこにも実際には私は私のコードに使用することができること、なかった:

#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

私は一般的な構造が間違っていると思います。あなたはパラメータ名としてキーを持つ 'map'(C++ libドキュメントをチェックする)を作成し、値は読み込み値のベクトルとして作成する必要があります。あなたはアイテムを反復しながら何かをpush_backします( 'Parameter.push_back(ParStruct())')。間違っている –

+1

あなたは何を求めていますか?なぜこの[tag:c]にタグを付けましたか? –

+0

@ Jean-FrançoisFabreはい、間違っているようですが、完全に機能します。私はちょうど常にNULL値と正確にこれ(Parameter.push_back(ParStruct()))でそれを行う新しい配列を作成する必要があります。なぜ私に聞かないでください、私は初心者です:D – M4rty32

答えて

0

[OK]を、私はここに私の全体のプログラムであり、それは完璧に動作し、それを得ました。

#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; 
} 
関連する問題