2016-07-14 7 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 
.... 

내 프로그램은 지금 이와 같습니다. 나는 두 가지 문제가있다 - 나는 어떻게 벡터를 다루는 지 모른다. 그러나 나는 동적 배열 (아무리 많은 다른 매개 변수가 파일에 있고 또한 얼마나 많은 값을 가진 단일 매개 변수인지 알지 못한다.)과 argc를 사용하는 방법 때문에 그것들이 필요하다. 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 문서 확인)을 매개 변수 이름으로 키로, 그리고 값을 읽기 값의 벡터로 생성해야합니다. BTW 항목을 반복하는 동안 뭔가 push_back ('Parameter.push_back (ParStruct())'). 소리가 틀립니다. –

+1

무엇을 묻고 있습니까? 왜이 [tag : c]라고 태그를 붙였습니까? –

+0

@ Jean-FrançoisFabre 음, 틀린 것처럼 들리 겠지만 완벽하게 작동합니다. 필자는 항상 NULL 값을 가진 새로운 배열을 생성해야하며 정확히이 (Parameter.push_back (ParStruct()))를 수행해야합니다. 왜 나 한테 물어 보지 마. 초보자 야. D – M4rty32

답변

0

좋아, 나는 여기에 내 모든 프로그램과는 완벽하게 작동, 그것을 얻었다.

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