Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Positionierung innerhalb einer Datei

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: