ein String im Vector suchen /getline oder get usw ?
-
Guten Abend,
wie kann ich bitte, bzw wo finde ich wie man es kann das man z.b den String "test" im Vector dynSpeicher findet ? Wenn gefunden wurde dann den nachfolgenden wert ersetzte ?grüß
-
hallo !
vector <string> dynSpeicher; dynSpeicher.push_back("test"); cout << dynSpeicher.at(0) << endl;
-
Was soll das werden? Schon mal über std::map nachgedacht? http://www.cplusplus.com/reference/stl/map/find.html
-
Also ich möchte einen datensazu aus einer datei einlesen (im vector) das klappt ja auch, in diesem Datensatz möchte ich nach dem inhald des string erkennung suchen, wenn er dieser nicht vorhanden ist dann schreiben, wenn er vorhanden ist dann den nachfolgenden string austauschen gegen string schaltzeit. und dann wenn alles erleigt ist den vector wieder speichern.
Abspeichern von Schaltzeiten im groben gesagt.Da ich nicht weis wieviele zeiten ich später evtl eingebe wollte ich es im dynamischen speicher machen.
gibs die seiten auch auf deutscht ??

-
agga ugga schrieb:
hallo !
vector <string> dynSpeicher; dynSpeicher.push_back("test"); cout << dynSpeicher.at(0) << endl;setzt das nicht den string automatisch am dateiende ein ?
-
Brusko schrieb:
agga ugga schrieb:
hallo !
vector <string> dynSpeicher; dynSpeicher.push_back("test"); cout << dynSpeicher.at(0) << endl;setzt das nicht den string automatisch am dateiende ein ?
das schiebt den string in den vector rein.
string str("such mich"); vector <string> v; v.push_back("test"); v.push_back("testing"); v.push_back("such mich"); for ( int i=0; i<v.size(); i++ ) { if ( v.at(i) == str ) cout << str << " gefunden." << endl; }sind das große datensätze, die du bearbeiten musst ?
für große datensätze gibt es effektivere möglichkeiten als den vector.
-
nun wieviel es werden können kann ich zum jetzten zeitpunkt nicht genau sagen, sagen wir mal 10 fenster * 9 schaltzeiten pro tag in der woche 7
sind 630 datensetzte bestehen aus einmal die erkennung und dann die zeit. wenn ich das nun für steckdosen licht usw auch will kann ich evtl wohl auch 2000-3000 datensetzten kommen.
Was für eine möglichkeit gibts denn noch ?? aber bitte mit bedenken das ich anfänger bin in c++ programieren und sicherlich nicht gleich das schwierigste kann.
-
binäre bäume, hashverfahren sind effektiver als sequentielles speichern.
könntest auch ne fertige datenbank nehmen.
wenn die datenmengen aber nicht allzu gross und die zu speichernden objekte einfacher gestalt sind, reicht so ein vektor völlig aus.
-
nunja ich glaube das vieleicht 3000 daten bestehen nur aus zahlen (10101010 235959
die ersten geben die erkennung an die anderen die zeit) für ein PC doch wohl nicht viel sind oder ? für uns menschen wohl zuviel
hier mal der code mach aber ein warnung und der PC 'hängt' an der stelle und gibt die Fehlermeldung : warning: comparison beween signed and unsigned integer expressions
in zeile (hier) 16
/*** Daten im dynSpeicher schreiben ***/ void imdynSpeicherschreiben () { string erkennung = setzedaten.type+setzedaten.number+setzedaten.count + setzedaten.status+setzedaten.day; string schaltzeit = setzedaten.time; string komplettdatensatz = erkennung + " " + schaltzeit + "\n"; char lesestring[15]; ifstream leseDatei("zeitdaten.txt",ios::in); while (!leseDatei.eof()) { leseDatei.getline(lesestring, sizeof(lesestring)); dynSpeicher.push_back(lesestring); leseDatei.close(); } for (int i=0; i<dynSpeicher.size(); i++) { if (dynSpeicher.at(i) == erkennung) {cout << erkennung<<" gefunden."<<endl;} } dynSpeicher.push_back(komplettdatensatz); } /*** Datensatz speichern ***/ void speicherdaten () { ofstream speicherDatei("zeitdaten.txt",ios::out); copy (dynSpeicher.begin(), dynSpeicher.end(), ostream_iterator<string>(speicherDatei)); speicherDatei.close(); dynSpeicher.clear(); dynLese.clear(); }edit die fehler meldung kommt natürlich beim compilieren
-
Guck dir mal std::find an

-
wenn ich nun mit
vector<string>::iterator it = find(dynSpeicher.begin(), dynSpeicher.end(),erkennung)
DynSpeicher.erase(it) //lösche elementbleibt er dort auch hängen und später meldet er terminate called after throwing an instance of 'std::bad_alloc'
what(): std9bad:alloc
-
die zeile 16 ist eine warnung, bei der nichts hängen bleiben sollte.
wenn du das so schreibst:for ( unsigned int i=0; i<dynSpeicher.size(); i++)dann müsste die warnung verschwunden sein.
das problem muss also wo anders liegen.
bist du ganz sicher, das 15 zeichen für einen datensatz ausreichen ?vorschlag:
du könntest strukturen für deine datensätze benutzen.
dann kannst du alle datensätze mit einer anweisung lesen/schreiben
-
Brusko schrieb:
wenn ich nun mit
vector<string>::iterator it = find(dynSpeicher.begin(), dynSpeicher.end(),erkennung)
DynSpeicher.erase(it) //lösche elementbleibt er dort auch hängen und später meldet er terminate called after throwing an instance of 'std::bad_alloc'
what(): std9bad:allocDu musst natürlich auch prüfen, ob "erkennung" auch gefunden wurde - wenn nicht, gibt std::find dann "dynSpeicher.end()" zurück. Der Iterator zeigt damit hinter das Ende des Speichers, deshalb wird's vermutlich auch den Fehler geben.
-
autsch das mit dem abstürzen lag an den 15 zeicchen, eigentlich reichte das denn 1111111 000000 wäre die länge, 14 zeichen plus ein dazu.
ich weis noch nicht warum aber er speicher mit das etwas konfuss ab was vorger klappte. mus wohl was verändert haben
zumindest stürtzt nichts ab.Das abfangen wollte ich später auch noch machen...wenn ich weis wie *g*
-
sentation fault (core dumped) das liefert er mir aufjeden falf mit find, liegt es dadran das ich den fehler wenn er nicht findet noch nicht abgefangen habe ? die datensatz ist aber drin also finden müste er das.
-
warum benutzt du eigentlich zeichenketten.
die kennung, bzw. erkennung und die zeit kannst du locker jeweils in einen zahldatentypen packen.
das ganze dann in eine struktur oder klasse verpackt:#include <time.h> struct Datensatz { unsigned kennung; time_t zeit; };bzw.
class Datensatz { // private, public, je nachdem unsigned kennung; time_t zeit; };
-
nun auf string war ich erst gekommen da ich den Datensatz in eins hatte und nicht wie jetzt mit leertaste unterbrochen.wenn ich das hinbekommen hätte, würde ich alles gerne auf int haben. Vergleiche im ganzen programm int.
ich bin gerade noch mit deiner schleife zugange da hab ich bei mir noch ein fehler gesehen
-
for ( unsigned int i=0; i<dynSpeicher.size(); i++) { if (dynSpeicher.at(i) == erkennung) {cout << erkennung<<" gefunden."<<endl;} }das läuft noch nicht so ganz rund, er geht nicht in die schleife rein wegen erkennung, der datensatz ist aber da und wird eingelesen
-
Brusko schrieb:
autsch das mit dem abstürzen lag an den 15 zeicchen, eigentlich reichte das denn 1111111 000000 wäre die länge, 14 zeichen plus ein dazu.
ich weis noch nicht warum aber er speicher mit das etwas konfuss ab was vorger klappte. mus wohl was verändert haben*das* ist konfus. zeig mal den code mit find, der angeblich abgestürzt ist.
-
std::map<std::string, std::string> daten; daten.insert(std::make_pair("test","daten1")); daten.insert(std::make_pair("test2","daten2")); std::map<std::string, std::string>::iterator iter = daten.find("test"); if(iter == daten.end()) { std::cout<<"nix da"; } else { std::cout<<"gefunden: "<<iter->second; iter->second="daten geändert"; } iter = daten.find("test"); if(iter != daten.end()) { std::cout<<"gefunden: "<<iter->second; }
-
Also ich hab erst schon erstmal wohl noch ein fehler festgestellt, und zwar lass ich die daten zeilenweise einlesen eine zeile enspricht z.b 1010001 235959 wenn ich nin mit mit dynSpeicher.at(4) ein element anzeigen lasse, zeigt er mir das ganze an ich mus aber beim einlesen eine trennung ab der lerhezile schon haben.
get() liest ja z.b zeichenweise ein gibt es auch eine funktion die immer bis zum Leerzeichen oder newlinezeichen liest ?