Strona 1 z 1
[+] C++, jak łatwo zapisać z ostream do pliku?
: 29 marca 2011, 14:55
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?
: 29 marca 2011, 17:18
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?
: 29 marca 2011, 19:26
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;
}
: 02 kwietnia 2011, 13:02
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?
: 03 kwietnia 2011, 14:34
autor: kornicameister
Udało mi się też do tego dojść. Najbardziej męczące są zawsze pierdółki.
Dzęki za pomoc.