STL Search, std::distance atd? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

STL Search, std::distance atd? – C / C++ – Fórum – Programujte.comSTL Search, std::distance atd? – C / C++ – Fórum – Programujte.com

 

Malý
~ Anonymní uživatel
1 příspěvek
8. 8. 2025   #1
-
0
-

 Seznamuji se s C++ respektive STL a dost v tom plavu.

Máme soubor pokus.dat a chceme v něm najit sekvenci čtyř bytů 0x58, 0x15, 0x16, 0x33.
A pokud v něm daná sekvence bytl je vypsat offset vyskytu prvního byte dané sekvence.
O kodu níže se domnívám, že by to snad i mohl dělat.
Nicmeně std::distance neumí pracovat s iterátorem res.

První otázka je co s tím?




 

LPCWSTR szVersionFile = L"pokus.dat";

std::ifstream is(szVersionFile, std::ios::binary);
if (!is)
    return -1;

 std::array<unsigned char, 4> ebml_id{ 0x58, 0x15, 0x16, 0x33 };

 auto res = std::search(std::istream_iterator<char>(is), std::istream_iterator<char>(), ebml_id.begin(), ebml_id.end());

 std::cout << "found at offset " << std::distance(ebml_id.begin(), res) << '\n';

 

Nahlásit jako SPAM
IP: 2a0b:f4c2:4::108...–
gna
~ Anonymní uživatel
1905 příspěvků
9. 8. 2025   #2
-
0
-

V souboru najdeš (nebo nenajdeš!) to ebml_id a pak chceš zjistit vzdálenost od začátku souboru k té nalezené pozici. Takže ve volání distance není blbě druhý parametr, ale ten první.

Jenže istream_iterator je jednoprůchodový a už z něj (nejspíš) nedostaneš iterátor ukazující na začátek souboru, od kterého by se ta distance spočítala (a to ještě nejspíš nespočítala a prostě by se ten stream četl znova, ale o to nejde).

Na zkoušení můžeš ten soubor načíst třeba do vektoru, s jeho iterátory se pak dá dělat kdeco.

Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1905 příspěvků
9. 8. 2025   #3
-
0
-

Jo a nevím jestli je to úpně blbě, nebo součástí Windowsích "kouzel" s wide stringy, ale LPCWSTR jako parametr pro ifstream se mi teda nějak nezdá.

Nahlásit jako SPAM
IP: 213.211.51.–
JerryM0
Věrný člen
Včera   #4
-
0
-

ten tvuj kod je nějakej divnej. neměl by si nejdříve ten soubor otevřít ? k tomu je funkce open. doporučuju v binárním modu. https://cplusplus.com/reference/fstream/ifstream/       a otevíráš ho pro čtení bytů nikoliv LPWCSTR (wchar_t) a pak z něj číst asi nejspíš byte po bytu:

https://learn.microsoft.com/cs-cz/cpp/cpp/char-wchar-t-char16-t-char32-t?view=msvc-170

 Ano mužeš použít iterator, ale funkci iterátoru si musíš napsat sám je to přeci v manuálu:  https://en.cppreference.com/w/cpp/algorithm/search.html

takže bych doporučoval nepoužívat iterátor ale klasickou funkci seek a hledat první znak  0x58 a když ho najdeš tak otestovat další 3 znaky a když to není sekvence  0x15, 0x16, 0x33 tak vrátit ukazatel o 3 zpět. to je nejjednodušší způsob. vubec do toho iterátor nepleť. ten code co si napsal je uplně špatně ... 

Nahlásit jako SPAM
IP: 109.81.115.–
gna
~ Anonymní uživatel
1905 příspěvků
před 22 hodinami   #5
-
0
-

#4 JerryM
Open se udělá v konstruktoru a otevírá to binárně.

Jako wchar má jen název souboru a zdá se, že MSVC to umožňuje. Na čtení to samozřejmě nemá žádný vliv.

Vlastní iterátor psát nemusí a zřejmě mu nejde o soubory, ale o vyzkoušení těchto funkcí, tak to asi nebude dělat bez nich.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 26 hostů

Podobná vlákna

Namespace std; / using std::***; — založil Nadšenec

RichEdit - Search In Text — založil Arlene

FireFox vs. Live Search — založil yaqwsx

C/C++ program search-download — založil Johnny96

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032025 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý