Speicherbereich durchsuchen
-
Hi Community,
ich habe es nun geschaft endlich eine Datei "Binär" in den Speicher zu lesen.
Das Ganze ist ein Char-Array, die Datei ist 590Kbyte groß.Nun muss ich die Datei am besten im Speicher nach einer Zeichenkette durchsuchen und deren Position herausfinden.
Ich hab versucht die komplette Datei aus dem Char-Array in einen String zu kopieren und dann dessen Find-Funktion zu nutzen, was jedoch fehl schlägt da bereits nach den ersten 5 Buchstaben ein "\x00" bzw. "\0" auftaucht.
Wie kann ich jetzt den Speicher nach einem String durchsuchen, ich bin am verzweifeln habe bereits alle möglichen Möglichkeiten durch, auch die "\0" durch einen anderen Char wie "-" zu ersetzen, was jedoch nichts brachte.
Die Funktion "memcmp" soll da sehr hilfreich sein, was jedoch aus C stammt und mein Programm ist in C++ geschrieben. Würde es damit sowieso nicht hinbekommen.
Hoffe es kann mir jmd. helfen.
----------------------------
Kompiler: G++
IDE: Code::Blocks
----------------------------Gruß - Marcel
-
Das schöne an den Standardbibliotheksfunktionen ist ja, dass man die auch auf Arrays anweden kann.

-
Ok, das Problem hier ist wiederum das man nur nach einem "Char" im Array suchen kann und nicht nach Zeichenketten oder seh ich das falsch?
-
Das wird nicht funktionieren. Wenn dann mit: http://www.cplusplus.com/reference/algorithm/search.html
-
Nehmen wir an ich hab eine Char-Array mit folgendem Inhalt:
Hallo wie gehts dir?Und möchte folgendes suchen bzw dessen Position:
wieWie kann ich das anstellen?
Ich versteh die Funktion nicht.
-
In etwa so:
const char *str = "Hallo wie gehts dir?"; const char* findstr = "wie"; int len1 = strlen( str ); int len2 = strlen( findstr ); const char* p = std::search( str, str+len1, findstr, findstr+len2 );Dabei ist anzumerken das die memcmp Methode ganz wesentlich schneller sein kann.
-
Wenn die Anwendung nicht so zeitkritisch ist, kannst du das bequemer und sicherer mit
std::stringundstd::string::find()bzw.std::string::substr()lösen (allgemein mit Filestreams). Wenns auf die Performance ankommt (was wahrscheinlich ist), bist du aber mit den C-Funktionen besser beraten.
-
Nexus schrieb:
Wenn die Anwendung nicht so zeitkritisch ist, kannst du das bequemer und sicherer mit
std::stringundstd::string::find()bzw.std::string::substr()lösen (allgemein mit Filestreams). Wenns auf die Performance ankommt (was wahrscheinlich ist), bist du aber mit den C-Funktionen besser beraten.Sagt wer? Quelle?
-
Kommt auf die jeweilige Implentation an (sowohl STL als auch CRT). Aber in vielen Fällen dürfte es zutreffen das, für spezielle Fälle optimierte, Lösungen ganz wesentlich schneller sind, als das allgemeine Vorgehen bei vielen STL Implementationen.
-
David_pb schrieb:
Kommt auf die jeweilige Implentation an (sowohl STL als auch CRT). Aber in vielen Fällen dürfte es zutreffen das, für spezielle Fälle optimierte, Lösungen ganz wesentlich schneller sind, als das allgemeine Vorgehen bei vielen STL Implementationen.
hab das grad mal im Turbo C++ 2006 mit nem 350 kb textdatei getestet.
eine recht simple und naive c-like suche gegen std::search
500 durchlaeufe und dann jeweils den schnellsten hergenommen.c-like : std::search -> 1 : 4
der suchstring war pascal-like am ende der datei angefuegt, damit er auf jeden fall gefunden wird ;o) die laenge des gesuchten strings war 4 bytes.
Meep Meep
-
Ich sag doch, das kommt stark auf die Situation (und/oder die jeweilige Implementation) an.

-
Tachyon schrieb:
Sagt wer? Quelle?
Naja, das hab ich jetzt mal angenommen

Ich hab mir einfach überlegt, wenn direkt auf dem Speicher Operationen durchgeführt werden und keine Zeit für eine sichere Speicherverwaltung und benutzerfreundliche Funktionen benötigt werden (also C-Style), ist man wahrscheinlich leicht schneller. C++ tut ja das auch, was C kann, aber hat zusätzlich noch andere Funktionalitäten, die die Performance belasten...