JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=4d4e10ee255820715630d7b57ac39a11Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Datenverarbeitung mit fstream

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 12.03.2004, 20:03    Titel: Datenverarbeitung mit fstream Antworten mit Zitat

Bei meienm letzten Projekt hatte ich schon angefangen Dateien mit
Code:
fstream Datei("Test.txt");

statt mit
Code:
FILE * Datei=fopen(Test.txt");

zu lesen.
Für mein neues Projekt wollte ich komplett umsteigen, aber mir fehlen ein paar Funktionen.
Ich hab schon in etwa folgendes herausgefunden:
Code:

ifstream Datei; //Eine Datei zum lesen
fstream Datei;//Eine Datei zum lesen und schreiben
ostream Datei; //eine Datei zum schreiben
getline(Datei, Zeile); //Liest die nächste Zeile der Datei in den String
if(Datei.eof()); //testet ob die Datei zu ende ist
if(Datei.fail()); //testet ob die SDatei geöffnet werden konnte
Datei.open("Test.txt"); //öffnet die Datei
Datei.close(); //schließt die Datei

Was mir fehlt ist eine Funktion zum schreiben eines Strings in die Datei. Außerdem würde es mich interesieren, ob man den String nur in eine neue Reihe schreiben kann, ihn an die Letzte Reihe anhängen kann oder sonst irgendwo in der Datei einfügen kann. Und gibt es auch möglichkeiten sich in der Datei zu bewegen(wieder zum Anfang gehen, in eine bestimmte Zeiel springen, Zeile vor, Zeile zurück)

Ich hab schon ein bisschen in der MSDN gesucht, aber nix gefunden. Währe nett, wenn jemand ein paar Funktionen beschreiben könnte, oder mir sagen könnte wo ich Tutorials oder so was finden kann.

Mfg Jonathan
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 12.03.2004, 20:14    Titel: Antworten mit Zitat

Jo gibts alles..
guck mal hier:
http://www.cplusplus.com/ref/iostream/
(zum schreiben nimm am besten die << >> Operatoren!)

Einfach auf das Klicken was du willst, da gibts ne Referenz mit Beispielen dazu!

P.S.: gehört sowas nicht ins C++-Forum???
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 12.03.2004, 21:38    Titel: Antworten mit Zitat

Hier der schon gepostete Code - zusätzlich wird noch ein String geschrieben/ausgelesen...wenn du irgendwas daran nicht verstehst, sag bitte Bescheid, das kann ich dir gerne alles haarklein erklären!

Code:
#include <fstream>
#include <iostream>

using namespace std;

int main()
{
  const char* const dateiname = "datei.txt";
fstream datei(dateiname,ios_base::in | ios_base::out | ios_base::trunc);

if(!datei)
{
  cerr << "Fehler beim Öffnen der Datei " << dateiname << endl;
}
else
{
  string bla = "Hallo";
  datei << 123;
  datei << bla;
  datei.seekg(0,ios_base::beg); // An den Dateianfang gehen
  int i;
  string bla2;
  datei >> i;
  datei >> bla2;
  cout << "In " << dateiname << " steht: " << i << " und " << bla2<< endl:
}
return 0;
}

_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.03.2004, 08:09    Titel: Antworten mit Zitat

Cool, das sieht doch schon ganz prima aus.

Ich hab das jetzt so verstanden:
Code:
ios_base::in | ios_base::out | ios_base::trunc;

bedeutet das man mit den << und >> lesen und schreiben will.
Aber was heißt das ios_base::trunc?
<< Zeile; //heißt das der String der Datei hinzugefügt wird (macht der ne neue Reihe, oder hängt der an die letzte dran?
>> Zeile; //heißt die aktuelle Zeile aus der Datei lesen, wenn man keinen String nimmt, versucht der aus der Zeile, ne Zahl zu lesen

Die Datei wird beim Beenden des Programms automatisch geschlossen, man kann aber auch mit
Code:

fstream Datei;
Datei.open(dateiname,ios_base::in | ios_base::out | ios_base::trunc);
Datei.close();

selber öffnen und schließen.

Danke für die Hilfe, ich werds gleich mal ausprobieren!
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.03.2004, 08:17    Titel: Antworten mit Zitat

Ich hab das Beispiel von HotAcid mal kompiliert. Es treten 4 Fehler auf:

Code:
--------------------Konfiguration: test - Win32 Debug--------------------
Kompilierung läuft...
quellcode.cpp
F:\C++\test\quellcode.cpp(19) : error C2679: Binaerer Operator '<<' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' akzeptiert (oder keine
 geeignete Konvertierung moeglich)
F:\C++\test\quellcode.cpp(24) : error C2679: Binaerer Operator '>>' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' akzeptiert (oder keine
 geeignete Konvertierung moeglich)
F:\C++\test\quellcode.cpp(25) : error C2679: Binaerer Operator '<<' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' akzeptiert (oder keine
 geeignete Konvertierung moeglich)
F:\C++\test\quellcode.cpp(25) : error C2143: Syntaxfehler : Fehlendes ';' vor ':'
Fehler beim Ausführen von cl.exe.

test.exe - 4 Fehler, 0 Warnung(en)

_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 13.03.2004, 09:16    Titel: Antworten mit Zitat

ok, folgende Ergänzung:

Code:
#include <string>


und dann schreibe bitte
Code:
datei << i << endl;
datei << bla << endl;


Nach dem letzten "endl" muss ein ; anstelle des : stehen.


HotAcid hat Folgendes geschrieben:
noch kurz die Erklärungen zu ios_base:
in = Datei öffnen zum Lesen
out = schreiben
trunc = alten Dateiinhalt überschreiben, falls die Datei schon existiert


Du solltest schon Antworten auf deine Fragen lesen, ansonsten verliere ich irgendwann die Motivation, dir zu antworten, wenn du permanent nach Sachen fragst, die ich dir eienn Trhead vorher schon erklärt habe.

cu Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 13.03.2004, 12:35    Titel: Antworten mit Zitat

Ok ich bin jetzt ein bisschen weiter, aber mir ist aufgefallen, das der nur Text in eine Datei schreibt wenn man sie mit ios_base::trunc neu erstellt hat. Sonst funktioniert das irgendwie nicht:
Code:

fstream DMain(MainDatei, ios_base::in | ios_base::out | ios_base::trunc);
DMain << "Ein kleiner Testeintrag";

funktioniert.
Aber
Code:

fstream DMain(MainDatei, ios_base::in | ios_base::out);
DMain << "Ein kleiner Testeintrag";

funktioniert irgendiwe gar nicht. (Die Datei hab ich vorher natürlich erstellt und auch mit
Code:

if(DMain.fail())

getestet ob sie geöffnet werden konnte.
Das kann doch irgendwie nicht sein, das man nur komplett neue Textdateien schreiben kann, und nichts in eine bestehende anhängen kann.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
HotAcid
Super JLI'ler


Alter: 43
Anmeldedatum: 04.08.2002
Beiträge: 372
Wohnort: Berlin
Medaillen: Keine

BeitragVerfasst am: 13.03.2004, 15:07    Titel: Antworten mit Zitat

kann man

Code:
ios_base::app


aber das funktioniert nur in Kombination mit "out", du kannst also eine Datei nicht mit "out" UND "app" öffnen

cu Felix
_________________
StGB §§ 328 Abs. 2 Pkt 3:
Mit Freiheitsstrafe bis zu fünf Jahren oder mit Geldstrafe wird bestraft, wer eine nukleare Explosion verursacht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 07.04.2004, 19:39    Titel: Antworten mit Zitat

wie springt man eigentlich in eine bestimmte zeile, um die dann auszulesen?

bisher hab ichs nur auf die schnelle gemacht und zwar so:

Code:

void Text::GetStringFromFile(char* filename, int zeile)
{
     // ......
     ifstream input;
     input.open(filename);

     int i = 1;

     while(i <= zeile)
     {
      input.getline(fileread,74);
      text = fileread;
      charText = text.c_str();
      i++;
     }

}


MFG
Chris


<edit>
Wenn ich mit getline in einem char Array einen String gespeichert habe und diesen String dann einer std::string-Variable zuweise mittels Gleichheitszeichen zuweise, dann gehen die Steuerzeichen \n verloren und werden bei der Ausgabe nicht als Zeilenumsprung gesehen.
Wie kann ich das ändern bzw. gibt es eine bessere Lösung, um bei einer langen Zeile nach einer bestimmten Anzahl an Zeichen einen Zeilenumsprung zu erzeugen?
</edit>
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Zyrian
Super JLI'ler



Anmeldedatum: 30.08.2003
Beiträge: 321
Wohnort: Essen
Medaillen: Keine

BeitragVerfasst am: 13.04.2004, 23:55    Titel: Antworten mit Zitat

*push*
_________________
Schau mir in die Augen, Kleines.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum