czytanie i zapisywanie pliku binarnego

0

mam mały problem. Robię program który zapisuje 4 znakowe oznaczenia i 2 liczby jako parametry:

po okrojeniu kodu ze zbędnych śmieci
if (liczbatagów>0)
                {
                    file.open(string(plik,ios::out|ios::binary);
                    if (file.good())
                    {
                        filelenght=liczbatagów;
                        file.write((char*)&filelenght,1);
                        for (unsigned int i=0; i<filelenght; i++)//zapisz wszystkie oznaczenia
                        {
                            file.write(tags[i],4);
                            if(stringtocommand(tags[i]).arguments.size()>1)//jeśli są przynajmniej 2 parametry
                            {
                                for (int j=0; j<2; j++)//zapisz tylko 2
                                {
                                    number=atoi(stringtocommand(tags[i]).arguments[j].c_str());
                                    file.write((char*)&number,1);
                                }

                            }
                        }
                        file.close();
                    }
                    else
                    {
                        CommandOutputString.push_back("Failed to create file");//powiadomienie programu o błędzie
                    }
                }
                CommandOutputString.push_back(command);//dodanie komendy do chatu 

i odczytywanie:

file.open(plik,ios::binary|ios::in);
                if (file.good())
                {
                    file.read((char*)&filelenght,1);
                    for (int j=0; j<filelenght; j++)
                    {
                        lineh=new char[4];
                        file.read(lineh,4);
                        cout << lineh << endl;
                        invertoutput.push_back(string("addtotags ")+'"'+filetagtotag(string(lineh)));//dodanie polecenia do odwróconej listy poleceń
                        delete[] lineh;
                        for (int i=0; i<2; i++)
                        {
                            file.read((char*)&number,1);
                            lineh=new char[1];
                            itoa(number,lineh,10);
                            invertoutput[invertoutput.size()-1]+=' ';
                            invertoutput[invertoutput.size()-1]+=string(lineh);
                            delete[] lineh;
                        }
                        invertoutput[invertoutput.size()-1].push_back('"');//koniec ładowania lini
                    }
                    file.close();
                } 

niestety pojawiają się rózne dziwne błędy typu losowy znak lub ładowanie nieistniejącego oznaczenia

0

To debuger w dloń i klikaj step by step. Myślisz że ktoś zrobi to za ciebie? o_O

0

... no i z debuggera wiem, że jak ładuje 4 znaki to i to coś się psuje i dodaje mi jakiś znak albo ładuje co innego ale czemu?

0

Panie, co to niby znaczy "coś się psuje"? o_O Przecież pod debugerem widzisz każdą operację więc widzisz dokładnie kiedy i gdzie ci "dodaje jakiś znak".

0

Nic sie nie psuje - wypisujesz nieterminowany zerem ciąg znaków, to po 4 znakach dalej sa dane losowe, które wypisuje...

0

Tak, nie wgłębiając się za bardzo w kod tego programu widać, że źle wykorzystujesz funkcje write oraz read.

I tak na przykład w funkcji file.write((char*)&filelenght,1); zamiast jedynki jako argument wstaw sizeof(zapisywany typ), bo inaczej zapisujesz do pliku tylko jeden bajt zamiast sizeof(int).

Tak samo w odczytywaniu.

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