Słownik <map> i odczyt z pliku /jakieś dziwy/

0

Witam!

mam następujący problem:

Robię taki prosty programik konsolowy, który wczytuje listę słów z dwóch plików (o tej samej długości lini) i wstawia je do klasy map /konkretnie map<char, char, Str2>/

Problem polega na tym, że odczyt linii (słów) z pliku odbywa się bez najmniejszych kłopotów /czyta prawidłowo/ ale jak trzeba wstawić do map to zamiast właściwego słowa wstawia jakieś "krzaczki". Poniżej załączam kod. Będę wdzięczny za podpowiedź co z tym jest nie tak...

EDIT: A tak jeszcze konkretniej to wstawia nie krzaczki tylko jeden krzaczek (zamiast pierwszego słowa), po czym wyrzuca dźwięk głośniczka z obudowy i na tym koniec zabawy.

// Deklaracja klasy Słownika
class TSlownik
{

private:    
    class Str2
        {
        public:
        bool operator()(const char* s1, const char* s2) const
            {
                return strcmp(s1,s2) < 0;
            }
        };
    map<char*,char*,Str2> Words;

public:
    void dodaj(char* FROM,char* TO);
    void usun(char* FROM);
    void Wypisz();
};
//funkcja dodająca - dla danych stałych działa bez problemu
void TSlownik::dodaj(char* FROM,char* TO)
{
    Words[FROM]=TO;
}
//funkcja wczytywania z pliku (moment wstawiania)
ifstream baza1,baza2;
    char b1[40],b2[40],tmp1[40],tmp2[40];   
    if(AngPol)
        {
        strcpy(b1,"ang.txt");
        strcpy(b2,"pol.txt");
        }
    else
        {
        strcpy(b1,"pol.txt");
        strcpy(b2,"ang.txt");
    } 

    baza1.open(b1);
    baza2.open(b2);

    while(!baza1.eof())
        {
        baza1.getline(tmp1,40);
        baza2.getline(tmp2,40);
        S.dodaj(tmp1,tmp2);
        }

Tak jak mówię... Słowa są prawidłowo wpisane do tmp1 i tmp2 (sprawdzałem wypis). A funkcja dodaj działa bez problemów dla wywołania np dodaj("abc","bcd"). W czym jest rzecz?

0

Musisz wstawiać do słownika kopie danych napisów(strcpy()).
Teraz getline za każdym razem nadpisuje wcześniej wstawione wyrazy.

S.dodaj(strcpy(tmp1),strcpy(tmp2));

0

strcpy(napis) to w ogóle nie chce mi znaleźć takiej funkcji. Ja szczerze mówiąc też nie znam strcpy przyjmującej jeden parametr.

Zrobiłem

char t1[40],t2[40];

S.dodaj(strcpy(t1,tmp1),strcpy(t1,tmp2));

i owszem, jest poprawa ale bardzo nieznaczna. Mianowicie dźwięk z głośniczka się już nie wydobywa, ale dalej wstawia mi śmieci.

0

OK, pomyliłem się.

Myślałem, że strcpy() sam alokuje pamięć.

Zmień
char t1[40],t2[40];
na

char *t1=NULL,*t2=NULL;

Później:

 baza1.getline(tmp1,40);
baza2.getline(tmp2,40);
t1 = (char*)malloc(strlen(tmp1) + 1);
t2 = (char*)malloc(strlen(tmp2) + 1);
S.dodaj(strcpy(t1,tmp1),strcpy(t2,tmp2));
0

Teraz to mi w ogóle wywala błąd naruszenia ochrony pamięci w momencie w momencie gdy wychodzi z funkcji wczytującej.

Przepuściłem przez debugger to wywala go dosłownie przy takiej operacji:

004320ED   mov         dword ptr [edx+4],ecx

Probowalem z malloc (którego nie lubię), ale ostatecznie zrobiłem to samo z operatorem new.

Zachowuje się w obu przypadkach tak samo.

0

A dlaczego nie tak?

map<string,string,Str2> Words;

???

0

w sumie to niegłupia sugestia. Pozmieniałem co się dało i pomogło.

Tylko strasznie mnie denerwuje ilość warning'ów wyskakująca w Visual Studio przy używaniu klas typu string.

Ale dzięki.

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