NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: špatně vypisujou stringy

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
petr.dar
Člen
Avatar
petr.dar:9.9.2015 1:34

čau lidi, začínám dělat na prográmku kterej by mě zkoušel z angličtiny.
Mám třeba soubor aj.txt, ve kterém jsou napsaná slovíčka:

collect-sbírat
launch-zahájit,představovat(novou věc)
competitor-konkurent
point of view-hledisko,názor na věc
angry-rozzlobený,vzteklý
compare-porovnat
promoted-podporovat,povýšit
afraid-strach,bát se

No a pak mám zdroják ve kterém ta slovíčka ukládám do proměnné Lstring (Anglická slovíčka) a Pstring (český překlad):

#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;
struct SlovniSpojeni
{
    string Lstring;
    string Pstring;
}SS;
int main(int argc, char *argv[])
{
     enum size {Lsize,Psize};
    size Strana = Lsize;
    ifstream file("F:\\aj.txt");
    char chr = file.get();
    while (file.good()) {

        switch (chr) {
        case '\n':{
            Strana = Lsize;
            cout << "Tak : "<< SS.Lstring << " a " << SS.Pstring << endl;
            //tady bude dalsi funkce ktera s temi stringy pracuje
            SS.Lstring.clear();
            SS.Pstring.clear();
              break; }

        case '-':{
        Strana = Psize; break;
        }
        default:{
             Strana == Lsize ? SS.Lstring.append(&chr) :
                               SS.Pstring.append(&chr);
            break;}
        } //switch (chr)
        chr = file.get();
    } //while
    file.close();
    system("PAUSE");
    return EXIT_SUCCESS;
}

V QT se mi Lstring uloží dobře ale Pstring mi ukazuje i ty nesmyslný znaky. V dev-c++ se mi to ukazuje všechno blbě. Nenašly byjste tam nějakou chybu?

 
Odpovědět
9.9.2015 1:34
Avatar
Odpovídá na petr.dar
Patrik Valkovič:9.9.2015 7:53

Nebylo by praktičtější načíst celý řádek?
Do jednoduchého pole char? Práce písmenko po písmenku je dost neefektivní.

Editováno 9.9.2015 7:56
Nahoru Odpovědět
9.9.2015 7:53
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na petr.dar
David Novák:9.9.2015 8:53

Typický problém Windows a jeho Win-1250...

Tvůj program nejspíš předává konzole znaky jinak kódované, než by očekávala.. Vypadá to, že jí dáváš UTF-8 a ona by chtěla Win-1250.. Klasické ansi znaky (bez diakritiky) ten problém neovlivňuje, protože jsou binárně kompatibilní ve všech sadách.

Zkus trochu pohledat a něco pročíst..

Pěkná teoretická stránka na toto téma je např. http://utf8everywhere.org/
Tady je nějaká funkce, co by ti od pohledu mohla pomoct: https://msdn.microsoft.com/…S.85%29.aspx

Je taky možné, že tvůj program čte ze souboru ve špatném kódování a text se "rozbije" ještě než ho začneš vypisovat. Na to jsou tuším taky nějaké možnosti, jak specifikovat, které kódování se má použít.. Zkusil bych prvně přenastavit konzoli, pak kdyžtak mrknout na to otevření souboru.. ;)

Nahoru Odpovědět
9.9.2015 8:53
Chyba je mezi klávesnicí a židlí.
Avatar
Lukáš Hruda
Tvůrce
Avatar
Odpovídá na petr.dar
Lukáš Hruda:19.9.2015 14:09

Podle mě špatně používáš metodu append. Metoda očekává řetězec ve stylu C, který ale musí být null-terminated. Ty tam předáváš adresu lokální proměnné typu char. Tahle adresa ukazuje na nějaký znak, ale co je v paměti za ním metoda neřeší, prostě ti tam přidá všechny další znaky až dokud nenarazí na nulu, proto ti to do toho stringu přidává nesmysly.

 
Nahoru Odpovědět
19.9.2015 14:09
Avatar
petr.dar
Člen
Avatar
Odpovídá na Lukáš Hruda
petr.dar:20.9.2015 17:32

Tohle by možná bylo ono, ale stejně je divný, že Lstring funguje dobře narozdíl od Pstring.
No ale já už jsem metodu get nahradil getline a vypisuju to už do jednoho stringu kde s tim už dál bezproblému pracuju. Ale stejně ... :-)

 
Nahoru Odpovědět
20.9.2015 17:32
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.