Bool-Variable für Datenexport

alpenkönig

Grünschnabel
Hallo,

Bin leider noch ein Anfänger auf diesem Gebiet :(

Ich habe einen Code der Daten von einem .txt file ausliest, sortiert und dann in ein neues .txt file schreibt.
Da ich nicht alle Daten brauche muss ich eine Bool-Variable definieren, damit nur Daten von bestimmten Kapiteln gelesen werden.

In der Zeile "else if (line.find(':') != string::npos)" sucht das Program nach dem ":" Diese ":" treten immer nach Überschriften wie "forces from reactions at point ties:" auf. Wenn die Überschrift "true" ist, soll das Program weiterlesen, ansonsten überspringen. Jetzt weiss ich nicht wie ich das implementieren soll :confused:

Wäre froh, wenn du mir da helfen könntest. Vielen Dank :)

Code:
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
#include <fstream>
using namespace std; 

class myItem {
public:
myItem(int T, int S, int I, const string& L): Time(T), Section(S), Id(I), Line(L) {}
int Time, Section, Id;
string Line;
bool operator < (const myItem& o) const {
if (Section != o.Section) return Section < o.Section;
if (Id != o.Id) return Id < o.Id;
return Time < o.Time;
}
}; 
int main() {
string line;
vector <string> Sections, TableHeads;
vector <myItem> AllData;
int curTime, curSection, curId;
// INPUT
while (getline(cin,line).good()) {
cerr << line << endl;
char dummy;
if (sscanf(line.c_str()," SOLUTION AT RAMP POINT %*d TIME %d",&curTime) == 1) { 
// A new ramp point and time, restart sections
curSection = -1;
} else if (line.find(':') != string::npos) {
// A new heading
string tablehead;
getline(cin,tablehead);
curSection++;
if (Sections.size() <= curSection) {
Sections.push_back(line);
TableHeads.push_back(tablehead);
}
} else if (line.find_first_not_of("- \r\n\t")==string::npos) {
// ignore line
} else {
// data line
int curId = line[0] == '*'? (~0u)>>1 : atoi(line.c_str());
AllData.push_back(myItem(curTime,curSection,curId,line));
}
}
// SORT
sort(AllData.begin(), AllData.end());
// OUTPUT
std::ofstream output ("//gt//home//h113027//GT26//forces_moments//final1//output.txt"); 

curSection = -1; curId = -1; 
for (vector<myItem>::iterator i=AllData.begin(); i!= AllData.end(); i++) { 
if (i->Section != curSection) { 
curSection = i->Section; 
curId = -1; 
output << Sections[curSection].c_str() << std::endl; 
} 
if (i->Id != curId) { 
curId = i->Id; 
output << "\nTime " << TableHeads[curSection].c_str() << std::endl; 
} 
output << i->Time << std::endl << i->Line.c_str() << std::endl; 
} 
output.close(); 
}
 
Ich weiß nicht genau, was du wo suchen möchtest, aber ich empfehle dir, reguläre Ausdrücke zu verwenden. Du findest sie in regexp.h.

Außerdem möchte ich an dieser passenden Stelle mal wieder Werbung für ein Tool namens AWK machen. Das ist ein Reportgenerator, der ursprünglich von UNIX stammt, aber auch für Windows als Gnu Open Source Programm erhältlich ist. Damit kann man schnell kurze und einfache Skripte schreiben, die Texte aus Dateien einlesen, verarbeiten und ausgeben. Er enthält eine Vielzahl nützlicher Funktionen, die ihn für nahezu jeden Zweck geeignet erscheinen lassen; trotzdem ist er relativ schnell zu erlernen. Da Brian W. Kernighan (zusammen mit Dennis M. Ritchie der Erfinder von C) einer der Entwickler der Urversion war, ist es nicht verwunderlich, dass die Syntax C-ähnlich ist.
Hier ist der Link zum Gawk.
 
Zuletzt bearbeitet:
Zurück