Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dateien ein - und auslesen

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 < [ 2 ] [ 3 ]
000
04.01.2007, 00:12 Uhr
~Suba Esel
Gast


moin!
Ich hab mich aus rein experimentellen Gründen mit dem Speichern in und dem Lesen aus Dateien beschäftigt. Folgendes hab ich nach lesen von FAQ und durchsuchen der unterschiedlichen Foren bereits zusammenbekommen:


C++:
#include <fstream>
#include <iostream>
using namespace std;

int main()
{
    string wert1="";
    string wert2="";
    cin >> wert1;
    cin >> wert2;
    cout << endl;

    ofstream out("C:\Test.txt"); // Wie kann man z.B. das Verzeichnis des Desktops herausbekommen?
    out << wert1 << endl << wert2;
    out.close(); // was bringt das? ich weiß nur, dass es dafür sorgt, dass man mehrere Zeilen einlesen kann

    wert1="Wert 1";
    wert2="Wert 2";

    cout << wert1 << endl;
    cout << wert2 << endl << endl;

    ifstream in("C:\Test.txt"); // siehe ofstream

    while (!in.eof())
    {
        string werte;
        in >> werte; // gibt es eine Möglichkeit, jede Zeile in eine andere Variable zu Speichern?
        cout << werte << endl;
    }
    in.close(); // was bringt das?
}




Ich hab jetzt einfach mal alles, wo ich Fragen hatte, kommentiert.

Guten Morgen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.01.2007, 11:28 Uhr
BoBtheREapER
kein job für nen BoB


wenn du eine datei öffnest dann musst du sie auch schließen, das ist wie mit new und delete. wenn du eine datei zum schreiben öffnest dann darf kein anderes programm die datei zum schreiben öffnen bis du sie wieder geschloßen hast. mit stream.geline() kannst du eine einzelne zeile einlesen.
--
"Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher." - Albert Einstein
www.blue-xenon.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.01.2007, 11:57 Uhr
~Suba Esel
Gast


@BoBtheREapER: ertmal danke für die antwort, aber:

1. Ich kenn mich in C++ noch nicht so aus. Was meinst du mit new und delete?

2.
Zitat von BoBtheREapER:
wenn du eine datei zum schreiben öffnest dann darf kein anderes programm die datei zum schreiben öffnen bis du sie wieder geschloßen hast.

Mit ifstream öffnet man die Datei doch nur zum Lesen, oder?
Außerdem: wenn ich die Datei nicht mit out.close(); schließe, kann ich trotzdem aus der Datei lesen, erhalte aber nur die erste Zeile.

3.
Zitat von BoBtheREapER:
mit stream.geline() kannst du eine einzelne zeile einlesen.

Das müsste doch stream.getline() sein, oder?
Wenn ich das so benutze, erhalte ich folgende Fehlermeldungen:
error: `stream' undeclared (first use this funktion)
error: (Each undeclared identifier is reported only once for each function it appears in.)
Wie kann man damit jetzt einzelne Zeilen einlesen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.01.2007, 12:28 Uhr
Blubber2063




Zitat von BoBtheREapER:
wenn du eine datei öffnest dann musst du sie auch schließen, das ist wie mit new und delete. wenn du eine datei zum schreiben öffnest dann darf kein anderes programm die datei zum schreiben öffnen bis du sie wieder geschloßen hast. mit stream.geline() kannst du eine einzelne zeile einlesen.


Das ist Unsinn, es gibt normalerweise keinen Filelock weil du nen Stream auf ne Datei öffnest, aber es ist z.B. bekannt das die Datei noch verwendet wird, weswegen sie nicht einfach gelöscht werden kann. Es kann sein das es auch Funktionen gibt die das exclusive belegen von Dateien erlauben, aber das ist kein Standarfall. Nebenbei stream.getline() liefert dir nur die Zeile bist dein übergebenes Arary voll ist. Besser std::getline(istream a, string b) Parameterreinfolge kann auch andersrum sein, schon ne Weile nicht mehr benutzt. Aber das liefert immer die ganze Zeile im std::string als Ergebnis.

1. mit new holt man sich dynamisch Speicher vom Betriebssystem und mit delete gibt man ihn wieder frei.

2.
ifstream ist nur fürs Lesen da ist korrekt.

3. Du darfst das nicht so schreiben. Stream bezeichnet dein ifstream Objekt, also in deinem Fall müsstest du in.getline() schreiben, aber wie gesagt besser ist getline(in, <stringvariable>.

Dann noch zur Erklärung deines Problems wegen close und der ersten Zeile. Datein werden meist in Blockgröße geschrieben, d.h. das BS oder der C++ Stream, puffern deine Anforderung bis es sich lohnt zu schreiben. Um einen Schreibvorgang zu "erzwingen", muss man dann die Methode flush() aufrufen. Genau das passiert wenn du close() aufrufst. Erst wird flush() aufgerufen und jetzt die Datei geschlossen.

Solltest du vergessen haben eine Datei zu schließen, tut das Betriebssystem dies wenn das Programm endet. Damit man hier keine handle s mehr hat die übrig bleiben. Trotzdem sollte man besser seine Dateien selbst schließen, wenn man sie nicht mehr braucht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.01.2007, 12:54 Uhr
~Suba Esel
Gast


Das hat mich jetzt ein ganzes Stück weitergebracht! Ich hab jetzt kapiert, was ich wie machen muss.

Trotzdem hab ich jetzt noch drei Fragen^^

Die erste: wie kann man z.B. das Verzeichnis des Desktops herausbekommen?

Die zweite: kann man irgendwie jede Zeile in eine andere Variable packen?

Die dritte: wieso gerade std::getline(in, <stringvariable>, in >> werte funktioniert genauso

P.S.: Das war grade das 4. Mal, das der den Sicherheitscode nicth angenommen hat
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.01.2007, 12:56 Uhr
~Suba Esel
Gast



Zitat von Suba Esel:
in >> werte funktioniert genauso

ich mein natürlich in >> stringvariable
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.01.2007, 13:25 Uhr
Blubber2063



Nein tut es nicht, in << strvar liest nämlich nur bis zum ersten Leerzeichen, getline liest aber bis zum Zeilenende.

Naja wenn du es nicht in einer Schleife machst, ja du kannst natürlich jede Zeile in eine andere Variable packen, wobei es sich dann empfehlen würde einen Array auf zu machen und dann in jedes Element eine Zeile zu Speichern, aber du bist dann immer auf die Länge der vorher definierten Elemente festgelegt, besser du nimmst dann eine std::List, es sei den du bräuchtest den direkten Zugriff.

Das mit dem Desktopzugriff kann ich dir jetzt nicht sagen, müsste ich suchen. Tipp doch einfach mal bei google msdn und Desktoppfad ein. Ansonsten such direkt in der MSDN, aber vorsicht so richtig übersichtlich ist die nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.01.2007, 14:47 Uhr
~Suba Esel
Gast


Ich weiß leider nicht, wie man eine Liste erstellt, bearbeitet etc., weil ich noch nich lange programmiere. Ist aber nicht so wichtig, ich denke mal, dass das mit arrays sowieso praktischer ist, weil man dann direkten Zugriff hat.
Desktopzugriff ist ganz einfach: unter WinXP C\Dokumente und Einstellungen\\All Users\\Desktop\\
Bin ich grade eben selbst drauf gekommen^^
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.01.2007, 14:55 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na ja, evtl. wird eine Liste für dich einfacher sein, weil du da keine Begrenzung der Größe hast (außer des physikalischen Speichers natürlich). Du kannst beliebig Werte anhängen, entfernen, ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.01.2007, 15:14 Uhr
~Suba Esel
Gast


Kann ich eigentlich auch bestimmte Werte auslesen? Also zum Beispiel wenn ich jetzt Zeile 10 auslesen will, gibt es dafür ne bestimmte Funktion?
Oder muss man die ganze Datei in ne Liste / array schreiben, und kann ich dann bei der Liste den 9. Eintrag (geht ja bei 0 los) direkt auslesen? Bei nem array ginge das.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: