Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Czytanie z pliku od danego znaku do danego znaku

Ostatnio zmodyfikowano 2018-08-04 17:40
Autor Wiadomość
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?
P-172006
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ń.
P-172007
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.
P-172012
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
P-172013
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:
  • 4 bajty - ilość rekordów w pliku (N)
  • (N + 1) * 4 bajty - offsety rekordów (dodatkowy to rozmiar pliku)
  • ??? - rekordy
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..?
P-172014
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)
C/C++
#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();
           
            //// tutaj nie wiem jak wczytać 3 kolejne linijki tekstu do zmiennych
           
            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!
P-172015
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.
P-172017
« 1 »
  Strona 1 z 1