Wolfff Temat założony przez niniejszego użytkownika |
Czytanie z pliku od danego znaku do danego znaku » 2018-08-03 17:54:50 Cześć, szukam jakiegoś "eleganckiego" rozwiązania do mojego problemu. Użytkownik ma parę opcji, odznaczając jedną dostaje znów parę. Po wyborze ostatniej chciałbym wyświetlić odpowiedni tekst. Na przykład wybiera opcję nr. 3 potem w tej opcji dostaje kolejny wybór i wybiera 4 a potem 1. Idealnym rozwiązaniem było by szukanie w pliku .txt linijki w której znajduje się 341 i od niej do następnej liczby wszystko pobrać do std::string.
Rozwiązaniem którego próbowałem było getline, przyrównywanie wyniku każdej pobranej linijki tekstu do wcześniej określonej (przez akcje użytkownika) zmiennej. Jeżeli zostanie znaleziona to linijka po linijce jest pobierana do momentu aż linijką tekstu nie będzie (w tym przykładzie) 342 (czyli następna opcja).
Bardziej zwięźle idea to: szukaj "numer" -> jak znajdziesz pobieraj wszystko -> jak pobierzesz "numer + 1", przestań.
Jest to jednak dosyć męczące i zawiłe wyszukiwanie, stąd też moje pytanie: wie ktoś może czy można ten proces ukrócić, zrobić lepiej?
|
|
pekfos |
» 2018-08-03 18:13:29 Napisz program, który zrobi to za ciebie. Nie wiem co znaczy, że wyszukiwanie jest "męczące", jeśli robi je program. Czego dokładnie oczekujesz? Algorytmu łatwiejszego w implementacji, czy szybszego? Z tego co napisałeś wynika, że liczby są po kolei, wiec możesz próbować użyć wyszukiwania binarnego, by znaleźć linię z żądanym numerem szybciej, ale to trzeba by sprytnie napisać i na pewno nie będzie to łatwiejsze do zrealizowania niż zwykłe wyszukiwanie sekwencyjne. Tak jak opisałeś format pliku, nie widzę prostszego rozwiązania niż twój pomysł szukaj "numer" -> jak znajdziesz pobieraj wszystko -> jak pobierzesz "numer + 1", przestań. |
|
|
jankowalski25 |
» 2018-08-04 13:38:07 Jeśli szukasz czegoś szybszego, to zmień format pliku. Czyli na przykład możesz przy każdej opcji dorzucać numer bajtu, pod którym znajduje się dalszy ciąg. Oczywiście nie musisz ręcznie tworzyć takiego pliku, możesz napisać generator, który powylicza odpowiednie pozycje na podstawie podanej nazwy. |
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-08-04 14:36:55 Nie rozumiem za bardzo dorzucania numeru bajtu, a w odpowiedzi do pekfos'a to tak myślałem że może jest już gotowa funkcja do tego lub ludzie może robią takie rzeczy i by ktoś podlinkował zarys takiej funkcji jak na przykładzie funkcji do word wrappingu.
Jakby ktoś miał czas może zarysować kod jak to mniej więcej zrobić to byłbym bardzo wdzięczny! Jak na razie udało mi się wykombinować tyle: - otwieram plik - w pętli while pobieram linijkę przez getline do zmiennej string - przyrównuję pobraną linijkę tekstu do mojej zmiennej - jeżeli nie jest równa to leci dalej - jeżeli jest to tu nie wiem jak to napisać, żeby pobrało tekst z enterami oraz musi zacząć sprawdzać czy się nie pojawi moja zmienna +1 kiedy ma przestać pobierać, ale jak mogę dodać 1 do zmiennej std::string?
Dzięki wielkie za pomoc |
|
pekfos |
» 2018-08-04 14:50:32 Nie rozumiem za bardzo dorzucania numeru bajtu |
Plik tekstowy do najgorszy możliwy format do wyszukiwania, wstawiania, usuwania, itd. Jakbyś mógł szybko odczytać offset w pliku, gdzie znajduje się twój tekst, to mógłbyś go po prostu odczytać, żadne wyszukiwanie nie jest potrzebne. Format mógłby wyglądać tak: W ten sposób możesz jednym odczytem z pliku odczytać pozycję i rozmiar rekordu w pliku (różnica dwóch kolejnych offsetów) i drugim odczytem możesz pobrać całą treść rekordu naraz, bo z góry znasz rozmiar. Bez konieczności czytania czegokolwiek innego w pliku. jak mogę dodać 1 do zmiennej std::string? |
A skąd w ogóle wziąłeś liczbę w zmiennej std::string..? |
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-08-04 15:40:19 Żeby porównać każdy wczytany string z danym zapisem opcji musi to być string ale żongluje sobie z konwersją string do int dodaje i znowu na string teraz. Wszystkie elementy powinny działać, teraz muszę ogarnąć jak wczytać trzy kolejne linijki od miejsca znalezienia tej zmiennej do trzech kolejnych zmiennych string, chyba że mógłbym wczytać ze znakami białymi od razu. (W finalnej wersji zrobię vector string żeby nie tworzyć tylu zmiennych ale problem pozostaje) #include <fstream> #include <string> #include <iostream> #include <conio.h>
#include <cstdlib> #include <sstream> int main() { std::string znak; std::string tekst; std::string pierwsza; std::string druga; std::string trzecia; tekst = "000"; znak = "235"; std::fstream plik; plik.open( "names.txt", std::ios::in ) if( !plik.good() ) { std::cout << "nie udalo sie otworzyc pliku" << std::endl; } while( tekst != znak ) { std::getline( plik, tekst ) if( !( std::string::npos == tekst.find( znak ) ) ) { std::cout << "znaleziono!" << std::endl; std::cout << "a to 3 następne linijki" << std::endl; int i = atoi( znak.c_str() ); i++; std::ostringstream ss; ss << i; znak = ss.str(); std::cout << pierwsza << std::endl << druga << std::endl << trzecia << std::endl; } } plik.close(); return 0; }
Wiem że kod strasznie namieszany ale to napisane na kolanie, jak narazie staram się ogarnąć metodę, potem będę upiększał. Dzięki! |
|
Wolfff Temat założony przez niniejszego użytkownika |
» 2018-08-04 17:40:22 Czasem żeby rozwiązać problem trzeba go najpierw opisać. Dzięki wszystkim którzy się udzielili, już sobie poradziłem.
|
|
« 1 » |