[+] C++, jak

Potrzebujesz pomocy z C, C++, perl, python, itp.
kornicameister
Posty: 36
Rejestracja: 27 września 2010, 16:54

[+] C++, jak łatwo zapisać z ostream do pliku?

Post autor: kornicameister »

Mam jedno proste pytanie.
Mam w swojej klasie przeciążony operator ,,<<'', tak żebym mógł wynik działania klasy wyświetlić na konsoli.

Kod: Zaznacz cały

friend ostream &operator <<(ostream &out,const BLSolver &solver)
Tak wygląda deklaracja operatora, działa on. Ale chciałbym również tą samą drogą zapewnić wysłanie danych do pliku tekstowego. Ostream nie specjalnie sobie z tym radzi, zapisując jedynie pierwszą linijkę. Czy da się użyć innego strumienia aby jednocześnie radził sobie dobrze z wypisywaniem rozwiązania na ekran konsoli i do pliku?
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post autor: Rad »

To co piszesz jest dziwne, bo skoro dobrze wyświetla na coucie, to powinno równie dobrze zapisywać do pliku. Masz możliwość pokazania większej ilości kodu?
kornicameister
Posty: 36
Rejestracja: 27 września 2010, 16:54

Post autor: kornicameister »

Kod: Zaznacz cały

int main(){
    BLSolver solver;
    char name[50];
    cout << "Input filename : "; cin >> name;
    fstream fs("./solution.txt",ios: :o ut);
    if(solver >> name){
        cout << "Equasion = " << solver.getMainMatrix().getRows() << endl;
        cout << "Max variables = " << solver.getMainMatrix().getCols() << endl;
        if(!solver.solve()){
            cerr << "\nFailed to solve\n" << endl;
            cout << "Error code = " << solver.getError() << endl;
            return solver.getError();
        }else{
            cout << solver;
            fs << solver;
            fs.close();
        }
    }else{
        cerr << "\nFailed to load the data\n" << endl;
        cout << "Error code = " << solver.getError() << endl;
        return solver.getError();
    }
    return solver.getError();
}
Tak wygląda mój main.cpp. Sam operator poprostu dorzuca kolejne kawałki tekstu do ostream. Ewentualnie mogę go dorzucić jeśli potrzeba.


A nie przepraszam, on zapisuje tylko, że zapisuje jedynie linijki czystego tekstu.
Dlatego pokazuję jak wygląda operator.

Kod: Zaznacz cały

friend ostream &operator <<(ostream &out,const BLSolver &solver){
        //creating output
        double helper;
        out << "Equasions set\n";
        for(short i = 0 ; i < solver.mainMatrix->getRows() ; i++){
            for(short j = 0 ; j < solver.mainMatrix->getColsAt(i) ; j++){
                helper = solver.mainMatrix->getAt(i,j);
                if(helper != 0){
                    if(helper < 0) out << " - ";
                    else out << " + ";
                    out << abs(helper) << "x" << j+1 << " ";
                }
            }
            out <<" = "<<solver.freeVars->getAt(i,0) << endl;
        }
        if(!solver.solutions.empty()){
            out <<"\nPossible solutions\n";
            for(unsigned r = 0 ; r < solver.solutions.size() ; r++){
                cout<<"Solution number "<<r+1<<"\n";
                cout<<"Solution is ";
                switch(solver.solutions.at(r).type){
                case NORMAL: out << "acceptable" <<endl;    break;
                case DEGENERATED: out << "degenerated, but acceptable" <<endl;  break;
                case BAD: out << "- like it would be insanity to accept it"<<endl;  break;
                case REJECTED: out << " rejected because of null determinant"<<endl<<endl; break;
                }
                if(solver.solutions.at(r).sol != NULL){
                    Matrix *tmp = solver.solutions.at(r).sol;
                    for(short r2 = 0 ; r2 < tmp->getRows() ; r2++){
                        cout <<"X" << solver.solutions.at(r).columns.at(r2)+1 << " = " << tmp->getAt(r2,0) << endl;
                    }
                    cout << endl;
                }
            }
        }
        return out;
    }
Rad
Member
Posty: 1208
Rejestracja: 28 czerwca 2006, 15:05

Post autor: Rad »

W tej funkcji zaprzyjaźnionej czasami używasz cout. Wtedy wynik zostanie wysłany na standardowe wyjście za każdym razem. Co dokładnie nie jest zapisywane, a powinno?
kornicameister
Posty: 36
Rejestracja: 27 września 2010, 16:54

Post autor: kornicameister »

Udało mi się też do tego dojść. Najbardziej męczące są zawsze pierdółki.
Dzęki za pomoc.
ODPOWIEDZ