kann man mit ofstream ohne Buffer arbeiten? und/oder Alternativen zu spritf()?



  • Hallo,

    ich bin gerade dabei ein Prog zu schreiben welches ein Bin - File einließt, den Header auswertet und in einer Struktur ablegt.

    Bis hier kein Problem. Jetzt muss der Header im Klartext in ein Ausgabefile un ich dachte, ich könne das einfach mittels:

    for(int i = 0; i < 1024; i++){ 
    fileoutstream << "String" << endl;
    }
    

    In wirklichkeit sind das viel mehr Strings und Variablen die in den Stream geschoben werden.
    Funktioniert nicht wirklich, es gehen immer wieder Daten verloren.

    Meine Idee einen Buffer anlegen:

    char* buffer;
    

    und diesen befüllen und erst zum schluss in den Stream schieben. Leider fällt mir da immer nur sprinf() als Lösung ein. Aber das kanns doch eigentlich bei c++ nicht wirklich sein, oder?

    Ich hab auch schon bissel gegoogelt aber ich weiß eigentlich gar nicht so richtig nach was 😕 😕 😕

    Vielleicht könnt ihr mir ja helfen....


  • Mod

    Ich habe ganz schwer das Gefühl, dass dein Problem ganz woanders liegt. Bei den Streams gehen keine "Daten verloren". Jedenfalls nicht bei normalen Dateien auf einem normalen Computer.

    Beschreib mal lieber dein ursprüngliches Problem und nicht deine Lösungsidee.

    (Das Äquivalent von sprintf in C++ sind übrigens die Stringstreams. Aber das sollte eigentlich nicht nötig sein)



  • Danke schonmal für die schnelle Antwort, hier das Problem:

    Ich habe diverse Structs, befüllt mit Strings, Ints, doubles,...
    Diese möchte ich in eine Datei speichern.
    dazu lege ich mir einen ofstream an und befülle ihn mit << in zwei verschachtelten
    Schleifen.

    Ich habe das gleiche auch mit std::cout versucht und komme zum selben Ergebnis.

    Mal ein Bsp.:

    for(int i=0; i<size; i++){
    out_stream << "String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<  
        "String"<<endl;
    		out_stream.flush();
    }
    

    size habe ich mal auf 400 und mal auf 20000 gesetzt, das entstandene File
    ist aber immer gleich groß. Meine Frage ist jetzt wo stehen die Daten?
    ich habs mit und ohne flush() versucht aber das macht keinen Unterschied...


  • Mod

    Zeig mal ein vollständiges Beispiel. ofstreams verlieren keine Daten. Und sie arbeiten exakt so wie ostreams. Du hast irgendwo andere Fehler gemacht. Guckst du auch die richtige Datei an? Es gab hier schon unheimlich oft Fragen die darauf zurückzuführen waren, dass die Leute nicht wussten, wo sie ihre Dateien erstellen.

    In endl ist übrigens ein flush enthalten.



  • ofstream out_stream(destination_file.c_str());
    	out_stream.precision(15);
    
    	out_stream << 	"BigEndian: " << header.isBigEndian << endl <<
    			"Version: " << header.version << endl <<
    			"NameLen: " << header.nameLen << 
    			" \ Name: " << header.name << endl <<
    			"Checksum: " << header.withChecksum << endl;
    
    	if(header.additionalInfoLen > 0){
    		// TODO: make it
    	}else{
    		out_stream <<  "addInfoLen: " << header.additionalInfoLen << endl;
    	}
    
    	out_stream <<
    					"Timefac1: " << header.timefac1 << endl <<
    					"Timefac2: " << header.timefac2 << endl <<
    					"Timefac3: " << header.timefac3 << endl;
    
    	out_stream << "STARTTIME: " << header.startTime <<endl;
    
    	out_stream.precision(3);
    
    	out_stream << 	"Rate: " << header.sampleRate << endl <<
    					"Variablenanzahl: " << header.variableCount << endl;
    
    	for(unsigned int i = 0; i < 10000; i++){
    
    		Variable temp = header.values[i];
    
    		out_stream << "String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<
    				"String " << "String " << "String "<<endl;
    
    	out_stream.close();
    	return 1;
    

    Das ist jetzt der Inhalt der Methode, die die Datei schreiben soll.
    Die structs sind im Header definiert und werden in einer anderen Methode befüllt.

    Struct:

    struct Header{
    	float version;
    	string name;
    	unsigned int nameLen;
    	unsigned int isBigEndian;
    	unsigned int withChecksum;
    	unsigned int addInfoLen;
    	unsigned int variableCount;
    	double timefac1;
    	double timefac2;
    	double timefac3;
    	double startTime;
    	double sampleRate;
    	vector<Variable> values;
    };
    

    Beispiel "Füllung" - aus einem char* Buffer (gefüllt aus einem Bin File)

    // buffer = char* und ist filesize groß 
    
    count = 0;
    
    unsigned int currentInt = (buffer[++count]<<8)+buffer[++count];	
    	//-------------------------------------------------------------------------------
    	header.version = (float)currentInt/100;
    
    	header.typeVendorLen = (buffer[++count]<<8)+buffer[++count];			
    	for(unsigned int i = 0; i < header.nameLen; i++){
    		header.typeVendor = header.name + buffer[++count];
    

    Nicht wundern, das erste Byte wird vorher ausgewertet. (ist hier bissel doof - aber nicht die endgültige Lösung)

    Ich hoffe das bringt mehr licht ins dunkel.
    Das hier schonwieder die Schleife mit den Strings ist kann ich nicht ändern
    aber an dieser Stelle ist das Verhalten so wie von mir beschrieben.

    PS.: Ich hab das richtige File und bin mir da auch sicher 🙂 aber hätte ja sein können.



  • schwarzklaus schrieb:

    for(unsigned int i = 0; i < 10000; i++){
    

    Ist die schließende Klammer an der richtigen Stelle (In deinem Codeauszug jedenfalls nicht)?



  • in wirklichkeit ist sie an der richtigen Stelle 🙂
    Ich hab mal nur das hier her kopiert was irgendwie nicht wirklich funzt, im Code bei mir ists zu Zeit n bissel unaufgeräumt durch die Fehlersucherei 😃 ist ja auch bald ostern 😃


  • Mod

    schwarzklaus schrieb:

    im Code bei mir ists zu Zeit n bissel unaufgeräumt

    Ich glaube, ich habe dein Problem gefunden.

    Das ist kein Wunder, wenn bei unaufgeräumtem Code andere Sachen rauskommen als erwartet.



  • 1. ist mein code nur unaufgeräumt weil ich gerade am debugen bin.
    2. hilft mir das nicht wirklich weiter
    3. 1. nehme ich zurück
    4. ich hab den Fehler gefunden -> liegt nicht hier im Code, da liegt ein anderer

    hier im Code ist falsch-> Variable temp = header.values[i]; denn zum Testen waren nie so viele Values da 🙂

    Ich war wohl n bissel zu voreilig, wenn jemand Zeit hat könnt ihr ja den Thread einfach löschen...

    Danke an alle Antworter 😃


Anmelden zum Antworten