Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: c++ für dummies *grml*

  1. #1
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496

    c++ für dummies *grml*

    hallo liebe gemeinde!
    ich versuche mich gerade ein wenig in c++ und da stolpere ich doch gerade über das problem, wie ich eine datei zum lesen UND zum schreiben öffnen kann?

    lesen alleine und schreiben alleine stellt kein problem dar...

    ich blättere gerade ein wenig im c++ in 21 tagen (von sams) rum, aber da steht nichts davon drin ;(
    warum kann des nicht so einfach sein wie in c?

    danke für die hilfe!
    greetz

    Code:
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    	ofstream fout("test.txt",ios::binary);
    	fout << "test" << endl;
    	cout << "geht!" << endl;
    	fout.close();
    	return 0;
    }

  2. #2
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Hi,

    meines Wissens gibt es nur die Streams zum lesen _oder_ schreiben. Alles andere macht so auch keinen Sinn. Ob man nun eine Datei gleichzeitig mit beiden Streams öffnen kann, weiß ich aus dem Kopf leider nicht.

    Es wäre aber gut, wenn Du das Problem auch im Quellcode zeigst, bzw. sagst, was genau Du gemacht hast.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  3. #3
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    den obigen kleinen codeschnipsel würd ich so umschreiben wollen, dass schreiben als auch lesen funktioniert.
    ich habe vor längerem mal ein tool in c geschrieben, welches in einer wavefile eine datei verstecken kann... nun wollte ich das gleich in c++ versuchen und scheitere genau an diesem punkt, da ich bestimmt bytes lesen muss, um sie danach wieder zu überschreiben (read -> seek -> write). die datei jetzt andauernd
    - lesend öffnen
    - lesend schließen
    - schreibend öffnen
    - zu den bytes hinspringen und überschreiben
    - schreibend schließen
    - ... und wieder von vorne
    ist mir einfach zu umständlich

    greetz

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    * ios_base::in becomes "r" (open existing file for reading).
    * ios_base::out or ios_base::out | ios_base::trunc becomes "w" (truncate existing file or create for writing).
    * ios_base::out | ios_base::app becomes "a" (open existing file for appending all writes).
    * ios_base::in | ios_base::out becomes "r+" (open existing file for reading and writing).
    * ios_base::in | ios_base::out | ios_base::trunc becomes "w+" (truncate existing file or create for reading and writing).
    * ios_base::in | ios_base::out | ios_base::app becomes "a+" (open existing file for reading and for appending all writes).
    -> std::fstream file("name",std::ios::in | std::ios::out);

  5. #5
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    hey thx!
    des steht nicht in dem scheiß buch, dass man des zamdingsln kann...

    greetz

  6. #6
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    122
    Das Buch ist echt schlecht, ich hab es auch.
    Du solltest dir ein anderes anschaffen...
    C, Python, OCaml

  7. #7
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    hab das buch von so einer kostenlosen ebook aktion *gg*
    welches würdest du empfehlen?

    greetz

  8. #8
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    so ich habe nun eine kleine klasse:

    nun möchte ich an eine bestimmte stelle im code springen, um zum beispiel das geschriebene wieder auszulesen. ist das bei streams überhaupt möglich?
    wenn ja, bitte um kleinen hint *Gg*

    greetz

    antwort:
    Code:
    #include "wavecoder.hpp"
    
    using namespace std;
    
    class WaveFile
    {
    	private:
    		fstream wavefile;
    	public:
    		WaveFile()
    		{
    			wavefile.open("test.txt",ios::binary | ios::in | ios::out | ios::ate);
    		}
    
    		~WaveFile()
    		{
    			wavefile.close();
    		}
    		
    		void schreibe()
    		{
    			wavefile.seekp(0);
    			wavefile << "muahaha" << endl;
    		}
    		
    		void lesen()
    		{
    			wavefile.seekg(0);
    		}
    };
    
    int main()
    {
    
    	WaveFile *xxx = new WaveFile();
    	xxx->schreibe();
    	delete xxx;
    	return 0;
    }
    Geändert von quinte17 (29-12-2004 um 08:48 Uhr)

  9. #9
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    nun möchte ich an eine bestimmte stelle im code springen, um zum beispiel das geschriebene wieder auszulesen. ist das bei streams überhaupt möglich?
    Ja, klar. Den Stream mit std::ios::binary geöffnet hast du ja. Solche Streams kannst du mit z.B. mit den i/ostream::seek_ Funktionen auf eine beliebige Position setzen.

    Kleiner Text dazu:
    http://www.roguewave.com/support/doc...ibug/30-5.html

    P.S: In Headern is es wohl besser keine using-Deklaration reinzumachen.

  10. #10
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    wie meinst du des mit den using-deklarationen? meinst du damit die header die ich da zusätzlich noch einbinde?

    ach ja und noch eine frage
    wie kann ich das objekt im konstruktor sterben lassen, wenn etwas schiefgeht (öffnen der datei zum beispiel)?

    oder ist es eher eine schlechte idee dateien im konstruktor zu öffnen?

    greetz
    Geändert von quinte17 (29-12-2004 um 11:37 Uhr)

  11. #11
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von quinte17
    wie kann ich das objekt im konstruktor sterben lassen, wenn etwas schiefgeht (öffnen der datei zum beispiel)?
    Die Grundidee ist doch, daß etwas im Konstruktor schief gelaufen ist (dein Objekt kann seine Aufgabe nicht erfüllen), üblicherweise wirft man dann eine Exception, und läßt den Aufrufer entscheiden, wie es weitergeht.

    Du kannst aber auch mit dem selben fstream-Objekt weiterarbeiten.
    Dazu löscht mit clear die Fehlerflags, und versuchst eine andere Datei zu öffnen.
    In dem Fall wäre es dann vielleicht besser, das öffnen einer Datei in eine Memberfunktion auszulagern.

    oder ist es eher eine schlechte idee dateien im konstruktor zu öffnen?
    Designentscheidung.

  12. #12
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    wie meinst du des mit den using-deklarationen?
    Das hier, "using namespace std;", ist eine using-Deklaration. Deren Effekt ist es, alle Deklarationen im Namespace "std" im aktuellen Namespace so vefügbar zu machen, als ob sie global deklariert wären. Und damit sind wir auch schon beim Nachteil angelangt: Namespaces sind ja extra eingeführt worden damit *nicht* alles global deklariert werden muss. (Zum Beispiel, um Namenskollisionen zu vermeiden) Using Deklarationen konterkarieren also den Zweck von Namespaces. In Dateien die du intern benutzt kannst du damit zwar Tipparbeit sparen. Aber wenn du sie in Header reinmachst, findet derjenige der den Header inkludiert dann einen vollgestopften Namensraum vor. Und er kann das nicht rückgängig machen.
    wie kann ich das objekt im konstruktor sterben lassen, wenn etwas schiefgeht (öffnen der datei zum beispiel)?
    Ich bin mir nicht ganz sicher was du mit sterben lassen meinst, aber wenn du im Konstruktor eine Ausnahme wirfst, wird das Objekt nicht zuende konstruiert, stirbt also in einem gewissen Sinne. Ausnahmebehandlung kann man aber nicht (oder sollte man nicht) in wenigen Sätzen erklären. Dafür würde ich dir eine systematische Einführung empfehlen (z.B. den Stroustrup).
    oder ist es eher eine schlechte idee dateien im konstruktor zu öffnen?
    Meiner Meinung nach nicht. "Kommt natürlich drauf an."

  13. #13
    Registrierter Benutzer
    Registriert seit
    20.11.2004
    Beiträge
    122
    Zitat Zitat von quinte17
    hab das buch von so einer kostenlosen ebook aktion *gg*
    welches würdest du empfehlen?

    greetz
    Hi, ich finde folgende Bücher sehr gelungen:
    - C++ lernen und professionell anwenden
    - C++ Entpackt
    - C++ Primer

    Ich würde sie auch in dieser Reihenfolge lesen.
    Geändert von `kk (29-12-2004 um 14:56 Uhr)
    C, Python, OCaml

  14. #14
    Registrierter Benutzer
    Registriert seit
    28.08.2002
    Beiträge
    496
    Zitat Zitat von locus vivendi
    Das hier, "using namespace std;"
    ok nun weiß ich was gemeint war, aber ich habe sie nicht im header. sie liegt in der *.cpp datei. habe mir schon gedacht, dass sowas nicht in die header gehören

    ich habe nun das öffnen der datei in eine methode gepackt, jetzt ist der aufruf zwar nicht mehr soo schön, aber damit kann ich leben ^^ (2 zeilen mehr code)

    und ich bin auch schon fast fertig mit dem was ich schreiben will (des zeug mit der wave-datei ist fertig, fehlt nur noch das einfachere einlesen der txt-file und das encoden..)

    greetz

  15. #15
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    ok nun weiß ich was gemeint war, aber ich habe sie nicht im header. sie liegt in der *.cpp datei. habe mir schon gedacht, dass sowas nicht in die header gehören
    Achso, ich hatte wegen der Klassendefinition gedacht das es sich um einen Header handelt. Ich habe wohl vergessen den Kasten mit dem Code von dir runterzuscrollen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •