Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

14.06.2009, 21:04

Speichern

Wie kann man Variablen in eine Text-datei Speichern ?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

14.06.2009, 21:07

In C++ z.B. mit einem std::ofstream.

FLO2

Treue Seele

Beiträge: 221

Beruf: Schüler

  • Private Nachricht senden

3

14.06.2009, 21:09

http://www.willemer.de/informatik/cpp/fileop.htm#file1
Meinst du das?
Pi mal Daumen = 18.84955592

goldfisch007

Alter Hase

Beiträge: 446

Wohnort: Süden von Berlin

  • Private Nachricht senden

4

14.06.2009, 21:48

hast du das buch von heiko? da gibts in der mitte
nen kapitel "fortgeschrittenes"oda so...
da steht was zu ifstream/oftsream
annsonsten:


https://www.spieleprogrammierer.de/phpBB…1798&highlight=

bzw.:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>
#include<stream>

using namespace std;

string String1= (bla);
string String2;
//zum schreiben einer variablen (String/char) benutzt man:



ofstream output("datei.txt", ios::app);
 output.write((char*)String1,sizeof(String1));
output.close();

//zum lesen:


 ifstream input ("datei.txt");
  getline(input,String2);
 input.close();

 if(input==NULL)
 {
     cout<<"Datei \"datei.txt\" nicht vorhanden."<<endl;
     Sleep(2000);
 }


(dieser codewird von mir so verwendet, wurde aber hierfür nicht compiliert...--> muss net alles so gehen wies hier steht z.B.: string zuweisung)

zum schreiben:

mit ofstream wird ein ofstreaobjekt erstellt (Name. output[kann beliebig sein]) in den klammern dahinter steht :
1. wie die datei heißen soll(hier: "datei.txt" name+endung is auch beliebig)
2.",ios::app" das steht dafür,dass alles was geschrieben wird angehangen wird an den inhalt der schon besteht (und nicht überschrieben wird...). Es gibt noch andere Flags, z.B.: ios::binary (Variablen werden als binärcode geschrieben[glaub ich ...] also einsen und nullen...) kannste googlen

dann kommt : output.write((char*)String1,sizeof(String1));

das ist die funktion mit der in die datei geschrieben wird. char* ist ein zeiger auf einen char (is halt so,weis nich genau wieso (brauch man net immer, nur wenn du z.B. int's schreiben willst ist glaub ich nen cast...))

String1 ist die variable die du schreiben möchtest (kann auch nen char,int sein....).

mit sizeof(String1) gibst du an wie groß der platz ist, der benötigt wird, um String1 zu schreiben.

mit output.close() schließt du dein ofstream objekt wieder.
---------------------------------------------------------------------
zum lesen von daten aus der datei:

dazu wird mit ifstream input("datei.txt"); zuerst ein Ifstreamobjekt (das I steht für input, bei ofstream steht das o für output) erstellt. "datei.txt" gibt an, wie die datei heißt, aus der du was lesen möchtest.

mit getline(input,String2); gehst du in eine zeile(meine dateien hatten bis jetzt immer nur eine...) und speicherst allesaus dem ifstreamobjekt input in den string String2.

danach wird mit input.close(); das ifstreamobjekt geschlossen.

C-/C++-Quelltext

1
2
3
4
5
if(input==NULL)
 {
     cout<<"Datei \"datei.txt\" nicht vorhanden."<<endl;
     Sleep(2000);
 }

stellt eine Abfrage da, mit der festgestellt wird, ob die datei "datei.txt" überhaupt existiert... wenn sie nicht vorhanden ist (if (input==NULL)) wird "Datei \"datei.txt\" nicht vorhanden." ausgegeben.

Hoffe man kann das jez verstehen und es hilft dir nen bissel weiter
bei fragen werd ich probieren die zu beantworten...(sofern mir möglich)

P.S.: das is für die konsole(weis net wie das bei der windowsprogrammierung mit dem schreiben in die datei gehandhabt wird...)

mfG
goldfisch007
Wir bauen auf und reißen nieder, so ham wir Arbeit ima wieder...
--------------------
http://www.piratenpartei.de/tmp/images/Slogans_5_0.png
--------------------
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender, geklaut von Helmut xD)

5

15.06.2009, 18:18

ok, ich versuch mal, das ein wenig vom kopf auf die füße zu stellen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ofstream output("datei.txt", ios::binary); //erstellt einen dateiausgabestrom mit dem Ziel "datei.txt" (name einschließlich endung ist beliebig). ios::binary aktiviert das binäre schreiben (s.u.). ios::app könnte man ebenfalls einsetzen bzw. mit ios::binary kombinieren, das sorgt dann dafür, das man nicht vom anfang der datei an schreibt, sondern an ihr ende anhängt.


int x = 5;
int y, z;

output << x; //schreibt x als text in die datei; mehrere verwendungen von << sind kombinierbar:

output << " x lautet " << x; //jetz sollte in der datei stehen "5 x lautet 5"


output.write(static_cast<char*>(&x), sizeof(int)); //schreibt x binär in die datei. der static_cast ist notwendig, weil ostream::write() einen char* erwartet und keinen int*


output.close(); //schließt die datei "datei.txt", wird automatisch bei der zerstörung des ofstream-objekts aufgerufen


//jetz der umgekehrte weg


ifstream input("datei2.txt"); //erstellt einen dateieingabestrom mit dem ziel "datei2.txt"


input >> x; //liest x, dass als text in der datei stand, ein; auch mehrere verwendungen von >> sind kombinierbar:

input >> y >> z;

input.read(static_cast<char*>(&x), sizeof(int)); //liest analog zu ostrem::write() daten binär ein


input.close(); //wie ofstream::close()


falls sich da wiederrum irgendwelche fehler eingeschlichen haben, berichtigt mich bitte.

@Windowsprogrammierung: oben das ist aus der C++-Standardbibliothek und funktioniert immer. wenn du mit der Win32-API programmierst, kannst du natürlich auch ihre dateizugriffsfunktionen verwenden, aber wofür?

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

15.06.2009, 21:48

Ach wenn wir mal beim Binary sind, was genau bewirkt das? Ich hab vor langer langer Zeit gelesen, es hätte was mit den Zeilenenden oder so zu tun, aber...
Wenn ich doch Daten (meinetwegen aus nem char Array als Puffer) da rein schreibe mit der write Methode, dann sind die Daten doch immer gleich oder nicht? Und auf der Festplatte sind die Daten ja immernoch gleich. Ich versteh nicht ganz, was es bringt...

Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

15.06.2009, 21:59

Zitat von »"Faule Socke"«

Ach wenn wir mal beim Binary sind, was genau bewirkt das? Ich hab vor langer langer Zeit gelesen, es hätte was mit den Zeilenenden oder so zu tun, aber...


Genau der Unterschied zwischen Binär- und Textmodus ist dass im Textmodus z.B. Zeilenenden ('\n') erkannt und richtig übersetzt werden (unter Windows z.B. wird ein Zeilenende durch '\r\n' dargestellt. Das hat historische Gründe: In Zeiten da man mit Computern noch nicht über Bildschirme sondern eine Art Drucker/Schreibmaschine kommunizierte benötigte es diese Zeichnsequenz ('\r\n' = Carriage Return and Linefeed = Wagenrücklauf und Zeilenvorschub) um eine neue Zeile anzufangen.)
Im Binärmodus wird dagegen 1:1 geschrieben was du reinfütterst...

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

8

15.06.2009, 22:11

Aah interessant, also wird ein '\n' vom Compiler nur in das entsprechende Byte umgewandelt, zu meinen Daten gelegt etc etc und dann an den Stream gegeben? Und wenn der im Textmodus ist, arbeitet er selber nach und macht ein '\r\n' draus? Funktioniert das nur mit dem << Operator oder auch mit der write-Methode? Oder wird das erst von den SysAPI Funktionen implementiert?

Socke

Werbeanzeige