Podwójny substr

0

Ciekawa sprawa. Robię sobie tak:

bufor = bufor.substr(0, bufor.find_last_of("/\\"));
bufor = bufor.substr(bufor.find_last_of("/\\"));

W buforze jest ścieżka do pliku. Potrzebna mi nazwa folderu, w którym jest plik. Obcinam więc stringa do ostatniego slasha, co daje nam: "c:\programfiles\costam\katalog"
W drugiej linijce więc chcę obciąć od ostatniego (teraz) slasha do końca. W efekcie jednak zawartość bufora wynosi "(???)".

Podczas gdy:

bufor = bufor.substr(0, bufor.find_last_of("/\\"));
std::string tmp = bufor.substr(bufor.find_last_of("/\\"));

Daje prawidłową wartość w tmp...
Dlaczego tak się dzieje...?

0

bufor jest rowniez std::string i domyslam sie, ze drugi dwuwiersz rozni sie od pierwsze tylko tym, ze drugi wynik wstawiasz do tymczasowej tmp ? dziwne.. [GDYBANIE]jedyne co mi na mysl przychodzi, ze copy-on-write lub inny podobny mechanizm oszczedzania pamieci w stringach spalil. tzn. ze:

bufor = bufor . substr (0 , x)
bufor = bufor . substr (x)

sa tozsame z :

bufor.assign( bufor . substr (0 , x)  ) //A
bufor.assign( bufor . substr (x)  )  //B

mozliwe, ze string zwracany z 'substr' jest tylko inteligentna kopia oryginalu, nie posiadajaca wlasnych danych, ale wiedzaca ze ona jest od-do, w tym przypadku assign z i-kopii w linii A jest bezpieczny - assign nie musi przepisywac danych, bo start jest taki sam i tylko end sie rozni -- wiec w efekcie assign wykona trucate. z kolei w linii B assign z i-kopii moglby byc niebezpieczny, gdyz musi przepisac dane, bo start sie zmienia - i w trakcie przepisywania jakis copy-on-write moze probowac oderwac/lub moze nie oderwac i-kopii od zmieniajacego sie wlasnie oryginalu..[/GDYBANIE]

nie, sorry - nie wiem.. to jest dziwne, nie przypominam sobie zebym spotkal sie z jakimkolwiek bledem cp-on-wr podczas operacji stringowych na samym sobie.. sugerowalbym przejrzenie calego kodu w okolicach tego 'bufor' oraz wyciachanie tych linijek do innego mikro-projektu .cpp i sprawdzenie czy na zhardcodowanych w pliku sciezkach te dwie linii tez sie blednie zachowuja

btw, podejscie Twoje jest troche na okolo, poniewasz funkcje find-x-of pobieraja tez index startowy, proponuje kod na wzor:

string bufor = "sda/sd/a/sd/a/d/dsad";
size_t pos_last = bufor.find_last_of("/\\");
size_t pos_2last = pos_last > 0 ? bufor.find_last_of("/\\", pos_last-1) : 0;

i teraz albo 1 przepisanie
docelowe = bufor.substr(pos_2last, pos_last - pos_2last); //mozliwy offby1-policz, plus jesli docelowe==bufor, to moze wystapic ten blad co u Ciebie
albo, lepsze 2 przykrojenia

bufor.resize(pos_last);
bufor.erase(0,pos_2last);

-- w tych 2 na pewno ten blad nie wystapi

niemniej, to co masz, powinno dzialac. substr zwroca kopie ktora -czy inteligentna czy nie - musi dac sie traktowac odrebnie gdyz jest nowym wystapieniem klasy std::string, i nie powinno wadzic assign z niej samej do oryginalu

ostatnie pytanie, ktore powinienem zadac na poczatku: jaki kompilator i jaka jego wersja? probowales na innym?

1 użytkowników online, w tym zalogowanych: 0, gości: 1