Forum: PC-Programmierung Datei öffnen mit C++


von L. J. (luke1)


Lesenswert?

Hallo Leute,

Ich habe eine Frage und zwar will ich eine Datei mit C++ öffnen, jedoch 
funktioniert das nicht so ganz wie ich es will. Der Code ist meiner 
Meinung nach richtig, aber irgendwo scheint ja wohl doch was falsch zu 
sein.
1
#include <iostream>
2
#include <fstream>
3
using namespace std;
4
5
int main(void)
6
{
7
    ifstream Quelldatei;                
8
    Quelldatei.open("Datei_1.txt", ios_base::in);
9
    if(!Quelldatei)
10
    {
11
       cerr<<"Eingabe-Datei kann nicht geöffnet werden\n";
12
    }
13
14
    cin.get();
15
}
Die Datei wird einfach nicht geöffnet und ich weiß ehrlich gesagt nicht 
wieso. Eigentlich sollte sich die Datei öffnen und lesen lassen. Oder 
seh ich da was falsch?

Danke für jede Hilfe :)

von Dussel (Gast)


Lesenswert?

Das sollte so funktionieren, nur dass das Programm so nichts sichtbares 
macht. Was passiert denn? Kommt die Fehlermeldung oder bricht schon das 
Kompilieren ab?

von L. J. (luke1)


Lesenswert?

Ja, die Fehlermeldung kommt. Aber ich bin mir nicht sicher wo ich die 
Datei abspeichern muss. Oder ist das egal?

von Dussel (Gast)


Lesenswert?

Beim Mac muss die im Benutzerverzeichnis liegen, bei Windows soweit ich 
weiß im Ausgabeverzeichnis, also da, wo auch die exe liegt. Das Programm 
kann ja nicht die ganze Festplatte nach der Datei durchsuchen. Wenn du 
den passenden Ort nicht findest, kannst du auch mal eine Datei schreiben 
und suchen, wohin die gespeichert wird.

ofstream Zieldatei;
Zieldatei.open("Datei");
Zieldatei<<"Hallo Welt";
Zeildatei.close();

So müsste das gehen, soweit ich mich erinnere.

von Daniel (root) (Gast)


Lesenswert?

Hast du auch "./datei" probiert?

von L. J. (luke1)


Lesenswert?

Also ich hab jetzt mal den Code von Dussel genommen und es funktioniert. 
Es wurde die Datei  Datei  erstellt und in dem Ordner abgelegt wo auch 
die .exe ist. Der Unterschied ist jetzt, dass ich vorher die Datei 
Datei_1.txt genannt habe und ich hab sie auch in dem Ordner der exe 
abgelegt. Sie konnte aber trotzdem nicht aufgerufen werden.
Die jetzt erstellte Datei ist nicht von dem Typ txt. Aber die kann ich 
auch wie gewohnt mit dem Editor öffnen und darin steht auch wie gewollt 
Hallo Welt. Lag es vielleicht an dem Typ der Datei?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Die jetzt erstellte Datei ist nicht von dem Typ txt

Das machst Du woran fest?

von L. J. (luke1)


Lesenswert?

Naja. Die Datei wird ja auch ohne Endung erstellt.
> Zieldatei.open("Datei");

und nicht Zieldatei.open("Datei.txt");

Aber daran kanns wohl auch nicht liegen. Denn ich habe die Datei ja 
jetzt erstellt. Und dann habe ich den Code genommen:
1
#include <iostream>
2
#include <fstream>
3
using namespace std;
4
5
int main(void)
6
{
7
    ifstream Zieldatei;                
8
    Zieldatei.open("Datei.txt", ios_base::in);
9
    if(!Zieldatei)
10
    {
11
       cerr<<"Eingabe-Datei kann nicht geöffnet werden\n";
12
    }
13
14
    cin.get();
15
}

Der Compiler führts aus. Der Error erscheint auch nicht, aber die Datei 
öffnet sich nicht. Kann ein ganz blöder Fehler sein, aber ich komme 
irgendwie nicht dahinter.

von Link zu (Gast)


Lesenswert?

> Hast du auch "./datei" probiert?
Wie kommst du darauf, dass er Linux nutzt?

@ L. J. (luke1)
> Die jetzt erstellte Datei ist nicht von dem Typ txt
Erstze, besser füge hinzu, folgendes
1
Zieldatei.open("Datei");
durch
1
Zieldatei.open("Datei_1.txt");
'Vom Typ txt' ist die Datei im übrigen trotzdem, es fehlt halt nur die 
Dateiendung.

Verrate uns bitte ein paar Dinge über das, was du da machst:
-Welches Betriebssystem?
-Arbeitest du mit einer IDE?


EDIT/Zu spät:
> Der Compiler führts aus. Der Error erscheint auch nicht, aber die Datei
> öffnet sich nicht.
Das kannst du gar nicht wissen, denn du öffnest mit dem obigen Quelltext 
die Datei und dann wartest du auf eine Benutzeingabe und dann bist raus 
aus dem Programm ohne dass du irgendetwas mit der Datei gemacht hast. 
Schreib erstmal ein paar Testausgaben in die Datei.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ifstream ist zum Lesen aus vorhandenen Dateien vorgesehen, open 
funktioniert folglich nur, wenn die angegebene Datei auch existiert.

Soll hingegen eine Datei erzeugt werden und etwas in diese geschrieben 
werden, muss ofstream verwendet werden, so wie es "Dussel" auch gemacht 
hat.

Dessen Beispiel aber nennt die Datei nicht *.txt, das sollte also 
entsprechend angepasst werden.

von L. J. (luke1)


Lesenswert?

Ja ich habe beim Beispiel von Dussel .txt hinzugefügt. Klappt ja  auch 
wunderbar. Die Datei wird mit Hallo Welt erstellt. So und dann wollte 
ich mit einem anderen Code die Datei wieder auslesen. Da habe ich 
gedacht, dass es mit dem Code funktionieren müsste. Die Datei ist 
schließlich in dem Ordner wo die ganzen .exe liegen vorhanden. Also 
kurz: Ich habe zuerst mit Dussel's Codebeispiel eine Datei erstellt und 
wollte mit der anderen die ich oben geschrieben habe die Datei wieder 
auslesen.

Ich arbeite unter Windows XP mit DEV-C++.

von Dussel (Gast)


Lesenswert?

Die Endung der erstellten Datei ist egal, es ging ja nur darum zu 
wissen, wohin sie erstellt wird.
Da die Fehlermeldung nicht mehr ausgegeben wird, scheint das öffnen ja 
geklappt zu haben. Jetzt musst du nur noch den Inhalt ausgeben (oder 
anders verarbeiten). Mit der Ausgabe bin ich mir nicht mehr ganz sicher, 
aber das ich glaube das geht zum Beispiel mit:
1
char c;
2
while(Quelldatei.get(&c))   
3
{
4
    cout<<c;
5
}

von Sven P. (Gast)


Lesenswert?

Dussel schrieb:
> Die Endung der erstellten Datei ist egal, es ging ja nur darum zu
> wissen, wohin sie erstellt wird.
Vermutlich ins Arbeitsverzeichnis. Ne Idee wär auch, als Dateiname 
'c:/test' oder sowas zu nehmen.

von Dussel (Gast)


Lesenswert?

Das haben wir schon rausgefunden, ich wollte mich nur 'rechtfertigen', 
dass ich der armen Datei keine Endung gegeben habe :)

Aber als Anmerkung: 'Quelldatei' muss in meinem Beispiel auch mit 
ifstream geöffnet werden. Mein Beispiel ist nur das Einlesen und 
Ausgeben des Dateiinhalts.

von L. J. (luke1)


Lesenswert?

Dussel dein Code war fast richtig. Man musste es so schreiben:
1
char c;
2
while(Quelldatei.get(c))   
3
{
4
    cout<<c;
5
}
Das & vor dem c war falsch aber trotzdem danke :) Ich habe das vor 
kurzem auf dieser Seite gefunden:
http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Dateizugriff

von Dussel (Gast)


Lesenswert?

Da habe ich mich dann vertan.
Funktioniert das Programm denn jetzt, wie es soll?

von L. J. (luke1)


Lesenswert?

Jap. Genauso wie es soll. Darum ein fettes Danke an alle und vor allem 
an dir Dussel :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.