• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Znaleźć string w stringu używając .find() - co robię źle?

Object Storage Arubacloud
0 głosów
194 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez RycerzAndromedy Użytkownik (670 p.)
edycja 3 maja 2016 przez RycerzAndromedy

Siemanko,

Wczytuję dane z pliku wierszami i zapisuję w tablicy vectorowej. Potem wczytując te same dane ale już z tablicy vectorowej szukam linii z napisem "UNITED STATES". Jeżeli znajdę "UNITED STATES" program ma sprawdzić czy linia znajdująca się 5 linijek wyżej zawiera w sobie słowo "CISCO". Jeżeli tak, licznik wzrasta o 1 (liczymy wszystkie takie przypadki).

Oto próbka wczytywanych danych:

00-00-0B   (hex)    MATRIX CORPORATION
00000B     (base 16)    MATRIX CORPORATION
    1203 NEW HOPE ROAD
    RALEIGH NORTH CAROLINA  276
    UNITED STATES
    
00-00-0C   (hex)    CISCO SYSTEMS, INC.
00000C     (base 16)    CISCO SYSTEMS, INC.
    170 WEST TASMAN DRIVE
    SAN JOSE CA 95134-1706
    UNITED STATES
    
00-00-0D   (hex)    FIBRONICS LTD.
00000D     (base 16)    FIBRONICS LTD.
    MATAM TECHNOLOGY CENTER
    HAIFA 31905
    ISRAEL
    ISRAEL
    
00-00-0E   (hex)    FUJITSU LIMITED
00000E     (base 16)    FUJITSU LIMITED
    Musashi-kosugi Tower Place Bldg.,
    Kosugi-cho 1-chome,Nakahara-ku
    KAWASAKI 211 Kanagawa 
    JAPAN

  • Wyszukiwanie uprzednio stringów "UNITED STATES" jest obowiązkowe, bo wymagane w dalszej części zadania. Dlatego obejście tego nie jest rozwiązaniem.

No więc: program się kompiluje, ale licznik nie chce liczyć. A jak widać z próbek - dane są w porządku. Coś więc jest nie tak...

Proszę o pomoc.

-----------------------------UPDATE---------------------------------------------------------------------------------------------------------

Zmieniłem kod tak żeby ściągało całe linie, i dalej licznik zwraca 0. Wydawało mi się, że to prosta sprawa. Pierwszy raz używam .find() , może tu się pomyliłem?

Aktualny kod:

#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
string napis1, napis2;
vector <string> linie;
int i, licznikCisco=0;
int main()
{
    ifstream napisy("oui.txt");
    ofstream wynik("zadanie4.txt");
    string cisco="CISCO";
    while (getline(napisy, napis1))
    {
        linie.push_back(napis1);
    }

        for (i=0; i<linie.size(); i++)
        {
            if(linie[i]=="UNITED STATES")
            {
               if (linie[i-4].find(cisco) != std::string::npos) {
            licznikCisco++;
}
            }
        }
wynik << "A) " << licznikCisco;
    napisy.close();
    wynik.close();

    return 0;
}

 

komentarz 3 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)
OK, ale nie podałeś w ogóle problemu, który cię trapi...
komentarz 3 maja 2016 przez DragonCoder Nałogowiec (36,500 p.)
Jednak mysle ze jest w temacie. Gdzies wystepuje blad i nie chce zadzialac funkcja find();
komentarz 3 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
Chyba powinienem : D.

No więc: program się kompiluje, ale licznik nie chce liczyć. A jak widać z próbek - dane są w porządku. Coś więc jest nie tak...

EDIT: Niektóre dane są 4 linijki wyżej, niektóre 5 linijek wyżej. Więc tu jest do poprawy. Ale wersja :  if (linie[i-4].find(cisco) != std::string::npos) też nie działa

1 odpowiedź

+1 głos
odpowiedź 3 maja 2016 przez Patrycjerz Mędrzec (192,320 p.)

Zauważ, że operator >> nie pobiera z pliku całego wiersza, a jedynie jedną frazę, oddzieloną od innych białymi znakami.

Lepiej użyj funkcji getlinehttp://www.cplusplus.com/reference/string/string/getline/.

komentarz 3 maja 2016 przez Munvik Dyskutant (9,350 p.)

Czym się różni otwieranie pliku przez ifstream... od fstream.open(...) ?

I czy ofstream to to samo co fstream.close() 

 

 

komentarz 3 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
1. niczym. to dwa sposoby na otwarcie strumienia.   Z tym że ifstream dotyczy strumienia wejścia (input file stream). analogicznie istnieje (ofstream - output f stream)
komentarz 3 maja 2016 przez Munvik Dyskutant (9,350 p.)
Dzięki ;)

Ale również potem trzeba zamknąć ? Jeżeli tak to dlaczego autor tematu nie zamknął obydwu plików tylko jeden ?
komentarz 3 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
Racja. Powinno się zamknąć oba pliki.
komentarz 3 maja 2016 przez Munvik Dyskutant (9,350 p.)
Tak, dopiero zobaczyłem, że jestes autorem i dzięki za  odpowiedź ;)

Podobne pytania

0 głosów
1 odpowiedź 176 wizyt
0 głosów
2 odpowiedzi 494 wizyt
0 głosów
1 odpowiedź 103 wizyt
pytanie zadane 11 października 2020 w C i C++ przez TlenekWodoru Użytkownik (520 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...