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

Odczytywanie tekstu z pliku...boje

Ostatnio zmodyfikowano 2013-03-02 17:34
Autor Wiadomość
naiL
Temat założony przez niniejszego użytkownika
Odczytywanie tekstu z pliku...boje
» 2013-03-02 15:17:16
Próbuję napisać funkcję, która zwracała by liczbę występowania słowa w pliku tekstowym, jednocześnie uzupełniała przez referencję wektor informacji o pozycji występowania danego słowa. Do funkcji przesyłam informacje o nazwie pliku(nazwa_pliku-string), szukanym słowie(AType-string) i vector(tablica_AType...no trafiona nazwa jak na wektor).
Szukam słowa. Ta część funkcji przez metodę find zlicza występowanie słowa.
#1
Przy read_line(string-do pobierania) i pozycja(informacja z .find)
C/C++
while( getline( plik, read_line ) )
{
    plik.clear();
    pozycja = read_line.find( AType );
    if( pozycja != std::string::npos )
    {
        tablica_AType.push_back(( plik.tellg() - 2 ) -( read_line.size() ) +( pozycja ) );
        ile_razy++;
    }
tu otrzymuję tragiczne warrningsy spowodowane jak się domyślam przeprowadzeniu +/- operacji na różnych typach zmiennych z nawiasu po push_back. Czy jest jakaś forma zapisu tego działania bez przepisywania/rzutowania?(nie wiem czy dobrze użyte słowo w tym kontekście) danych z plik.tellg(), string.siz(), pozycja(size_t?). Vector jest <int> w deklaracji. Mimo tych warningów działa... no ale wolałbym czysty rezultat kompilacji.
#2
Problem zaczyna się w wydrukiem i sprawdzaniem na piechotę o co kaman...
C/C++
tablica_AType.push_back(( plik.tellg() - 2 ) -( read_line.size() ) +( pozycja ) );
Od plik.tellg() odejmuję 2, że niby załapał "\n" przy wczytywaniu przez getline.
Tak te trafy zapisuje do vectora że to tak pi razy oko powinno być raz -2 raz -5 raz -1 żeby było poprawnie :).
Nie wiem czy jest to spowodowane formatowaniem w pliku tekstowym czy gdzieś zaczynam błądzić.
Czy jest jakiś kruczek/czki w posługiwaniu się tellg()? poza plik.clear() żeby wymazywać błędy?
#3-dwa w jednym
Nie mogę sobie poradzić z wypisywaniem na ekran fragmentu tekstu od "znalezionej pozycji występowania szukanego wyrazu".
#3a- wynik wyszukania pozycji jest mało powiedzieć niewłaściwy, wręcz przypadkowy.
#3b- nie wiem jak pobrać z pliku od podanej pozycji fragment tekstu zaczynający się szukanym słowem+5znaków za nim..
C/C++
plik.open( nazwa_pliku.c_str() );
plik.seekg( 0 );
for( unsigned i = 0; i < tablica_AType10.size(); i++ )
{
    plik.seekg( tablica_AType10[ i ], ios::beg );
   
    for( unsigned ifg = 0; ifg <= szukany_text.size() + 5; ifg++ )
    {
        wydruk =( plik.get() ); /// to nie wiem jak się wytłumaczyć :) nie mogę ogarnąć składni
    }
   
    cout << "linia: " << i + 1 << " " << endl << wydruk << "...(...)" << endl << "---------------------------" << endl;
    plik.clear();
}
wydruk raz robiłem string raz char wydruk[szukany_wyraz.size()+5];//5-na fragment za wyrazem.
#4- problem z konsolą... jeżeli liczba wyświetleń cout <<""<<endl przekroczy jakąś tam magiczną barierę mogę obejrzeć wydruki tylko do jakiegoś momentu...do połowy np. poradziłem sobie z tym pisząc w pętli while taki monitor/log tego co wykonuje programik, gdzie mogę sobie na piechotę z kalkulatorem analizować wyniki poszczególnych przejść pętli...

Nie chcę zaśmiecać bardziej wklejaniem całości.(Jeżeli ktoś będzie chciał odpalić, program generuje plik "log.txt"!(no zamiast niekompletnego wydruku z konsoli..)_:/
P-77473
naiL
Temat założony przez niniejszego użytkownika
» 2013-03-02 17:34:01
Zmieniłem na ios::binary i działa. Sprawdziłem źródłowy tekst w hexedytorze szukając znaków końca lini "Ox0d 0a".
To pytanie w takim razie dlaczego jeżeli po 19 znakach "widocznych" jest zakodowane dwa bajty 0d 0a tellg() daje wartość 27 zamiast 21? przy liczeniu pozycji szukanego słowa wychodzą krzaki bo tellg() daje wartości od 0 do szerokosci szukanego słowa.Dziwne to to ...
Przy czytaniu binarnym jest normalnie. Działa.


P-77494
« 1 »
  Strona 1 z 1