000
22.11.2005, 16:29 Uhr
rizi
|
hi,hab folgendes problem,ich habe mir eine klasse namens File geschrieben,die die methoden für schreiben und lesen an gewünschter position zur verfügung stellt.Das vorhandene .txt fiel welches ich schreiben bzw lesen möchte ist leer. Nun mein Problem wenn ich beim schreiben von dateibeginn zb 3L/5L/5L(egal welche position,bis auf 0L,1L,2L) positioniere erhalte ich eine exception(ios_state:fail bit set). wenn ich die exception nicht abfange und .clear() vorm lesen des streams aufrufe,kann ich den geschriebenen datensatz korrekt auslesen.jetzt meine frage warum bekomme ich immer diese exception???? hier ein auszug meiner klasse:
C++: |
#include <iostream> #include <fstream> #include <string> #include <stdexcept> using namespace std;
class FileError{
private: string error;
public: FileError(const string& err="Unknown Error"){error=err;} string& getErrorMessage(){return error;}
void setError(const string& err){error=err;}
}; class File{
private: string input_path,output_path,update_path,input; ifstream ifs; ofstream ofs; fstream ufs; int length; char typ;
public: File(const string& input,const string& output){ input_path = input; output_path = output; this->typ='u';//update openInputStream(); openOutputStream(); }
File(const string& path,char typ){ if(typ == 'r'){//read input_path = path; this->typ=typ; openInputStream(); } else if(typ == 'w'){//write output_path = path; this->typ=typ; openOutputStream(); } else if(typ == 'u'){//RELEVANTER FALL length=0; update_path = path; this->typ = typ; openUpdateStream(); } }
File(){}
~File(){ if(typ == 'r' && ifs.is_open()) closeInputStream(); if(typ == 'w' && ofs.is_open()) closeOutputStream(); if(typ == 'u' && ufs.is_open()) closeUpdateStream(); }
void openUpdateStream() throw(FileError); void closeUpdateStream() throw(FileError);
string& readAt(long position) throw(FileError);
void writeAt(string& outp,long position) throw(FileError);
void writeAt(const char* outp,long position);//ruft writeAt(string& ,long ) auf
void show();
};
|
Stream oeffnen:
C++: |
void File::openUpdateStream() throw(FileError){ ufs.exceptions(ios::failbit|ios::badbit); if(update_path.empty()) throw FileError("FileError_Exception:File::openUpdateStream(): Es wurde kein Pfad angegeben --> Stream kann nicht geoeffnet werden!");
if(ufs.is_open()) throw FileError("FileError_Exception:File::openOutputStream(): Stream bereits geoeffnet!");
ufs.open(update_path.c_str(),ios::in|ios::out|ios::binary);
}
|
WriteAt()/ReadAt():
C++: |
void File::writeAt(const char* outp,long position){ writeAt(string(outp),position);//ruft writeAt(string&,long) auf }
void File::writeAt(string& outp,long position) throw(FileError){ const char* temp = outp.c_str(); length = outp.length(); try{ if(ufs.is_open()){ ufs.seekp(ios::beg,position); ufs.write(temp,length); } else throw FileError("FileError_Exception:File::writeAt(): Stream wurde nicht geoeffnet --> SchreibeSn nicht moeglich!"); } catch(ios::failure& err){ string error; error.append("FileError_Exception:File::writeAt():" ).append(err.what()); throw FileError(error); }
}
string& File::readAt(long position) throw(FileError){ char* temp = new char[length]; try{ if(ufs.is_open()){ ufs.seekg(ios::beg,position); ufs.read(temp,length); temp[length]='\0'; } else throw FileError("FileError_Exception:File::readAt(): Stream wurde nicht geoeffnet --> Lesen nicht moeglich!"); } catch(ios::failure& err){ string error; error.append("FileError_Exception:File::ReadAt():" ).append(err.what()); throw FileError(error); } input.append(temp); return input; }
|
Klasse Testen:
C++: |
#include "FileUsage.h"
void testFile(){ try{ File f3("C:\\Dokumente und Einstellungen\\RR\\Desktop\\test.txt",'u'); //f3.writeAt("Hallo",0L);//funktioniert f3.writeAt("test",4L); //f3.readAt(4L); --> wuerde exception werfen,weil writeAt failbit setzt } catch(FileError& err){ cerr << err.getErrorMessage() << endl; } }
|
Dieser Post wurde am 22.11.2005 um 16:33 Uhr von rizi editiert. |