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;
}
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. –
Was fragst du? Warum hast du dies markiert [tag: c]? –
@ 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