Funkcja wyszukująca w pliku tekstu nie działa.

0

Witam! Tutaj mam sobie prostą funkcję (dla mnie nie, ale dla Was pewnie tak):

string LoadDifLang(int ID){
    ostringstream TmpSS;
    TmpSS<<ID;
    string id = TmpSS.str();
    ifstream stream("Text.lang");
    if(!stream){
        SetConsoleTextAttribute(hl, 13-1);
        cout<<"Cannot find file with text!";
        SetConsoleTextAttribute(hl, 8-1);
        exit(0);
    }
    string IdFromFile;

    bool Found=true;

    do{
        getline(stream, IdFromFile, ' ');
        Found = !IdFromFile.compare(id);
    }while(Found||stream.eof());

    if(Found!=false) { //Found != false it means Found==false
        SetConsoleTextAttribute(hl, 13-1);
        cout<<"Error! Cannot find the correct text\nBlad! Nie mozna znalezc poprawnego tekstu!"<<endl;
        SetConsoleTextAttribute(hl, OtherColor);
        stream.close();
        return "-Error!-";
    }
    else{
        string Text;
        getline(stream, Text, '\n');
        stream.close();
        return Text;
    }
}

No i problem jest w tym, że wyrzuca błędną wartość. Zamiast It works! to works!" //To omijane cudzyslowow omine
Tutaj jak to wygląda w pliczku:

1 "It works!"
2 "cos"
...

Nie wiem co może być przyczyną :/

1
while(Found || stream.eof());

Ta pętla będzie się powtarzać tak długo jak jeden z warunków będzie prawdą czyli albo:

  • Znaleziono ID
  • Dotarto do końca pliku

Jeżeli pierwsza linia nie pasuje to, Found ma wartość false i taka sam wartość zostanie zwrócona z eof(), co oznacza wyjście z pętli.

0

Wygląda tak:

do{
        getline(stream, IdFromFile, Char);
        Found = IdFromFile.compare(id);
    }while(Found||stream.eof());

Potrzebuje pan cały kod?

1

Nie przesadzaj z tym panem :). Netykieta obowiązuje.

Ciało pętli (to co znajduje się w środku) było OK - nie trzeba było nic zmieniać - problem leży w warunku.

Pętla powinna wykonywać się dopóki nie znaleziono ID i dopóki jest co czytać:

do
{
	getline(stream, IdFromFile, ' ');
	Found = !IdFromFile.compare(id);
} while (!Found && !stream.eof());
0

Przepraszam, że pana męczę, ale dalej coś nie tak. (Będę pisał "pan", ponieważ no.... kultura). Funkcja wygląda tak:

string LoadDifLang(int ID, Lang lang){
    ostringstream TmpSS;
    TmpSS<<ID;
    string id = TmpSS.str();
    ifstream stream("Text.lang");
    if(!stream){
        SetConsoleTextAttribute(hl, 13-1);
        cout<<"Cannot find file with text!";
        SetConsoleTextAttribute(hl, 8-1);
        exit(0);
    }
    string IdFromFile;

    bool Found=true;
    char Char = 32;

    do{
        getline(stream, IdFromFile, Char);
        Found = !IdFromFile.compare(id);
    }while(!Found&&!stream.eof());

    if(Found==false) { //Found != false it means Found==false
        SetConsoleTextAttribute(hl, 13-1);
        cout<<"Error! Cannot find the correct text\nBlad! Nie mozna znalezc poprawnego tekstu!"<<endl;
        SetConsoleTextAttribute(hl, OtherColor);
        stream.close();
        return "-Error!-";
    }
    else{
        string PLText;
        getline(stream, PLText, '/');
        string ENGText;
        getline(stream, ENGText, '"');
        stream.close();
        if(lang==PL) return PLText;
        else return ENGText;
    }
}

wywołanie tak:

string str = LoadDifLang(5, PL);

plik tak:

1 "To dziala!/It works!"
2 "elo/siema"
3 "mysl/think"
4 "krzeslo/chair"
5 "Cos/Something"
...

I teraz wyrzuca, ze nie może znaleźć :/. Nie wiem o co chodzi.

1
getline(stream, IdFromFile, ' ');

To będzie "wrzucać" każdy ciąg znaków oddzielony spacją do IdFromFile.

Przyjrzyjmy się Twojemu plikowi:

1<SPACJA>"To<SPACJA>dziala!/It<SPACJA>works!"<NOWA LINIA>
2<SPACJA>"elo/siema"<NOWA LINIA>
3<SPACJA>"mysl/think"<NOWA LINIA>
4<SPACJA>"krzeslo/chair"<NOWA LINIA>
5<SPACJA>"Cos/Something"<NOWA LINIA>

A teraz zobacz co będzie zwracać funkcja getline():

1
"To
dziala!/It
works!"\n2	# Zauważ że getline zwraca works!"\n2 (\n czyli nowa linia)
"elo/siema"	# 2 jest wyżej a to jest kolejny ciąg znaków oddzielony spacją
...

Dlatego IdFromFile.compare(id); jest zawsze != 0, bo nigdy nie porównujesz samego ID za wyjątkiem pierwszej linii.

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