Inhalt ans Ende anhängen
-
Hallo zusammen,
ich erstelle eine Textdatei mit einem Programm über
std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str());
danach öffne ich eine andere Textdatei dessen Inhalt ich lese und wieder ans Ende meiner ersten Textdatei anhängen möchte mit
std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str(),ios::app);
Es werden aber jedesmal zwei Textdateien erstellt.
Ich vermute es liegt daran, dass ich die Datei, die vorher vom User benannt werden kann und die Endung .txt besitzt nicht richtig angebe.
Kann mit jemand sagen ob es daran liegt und was ich ändern muß damit der nhalt einfach an das Ende geschrieben wird.Vielen Dank, Sebastian
-
Vermutlich hast du da irgendwo einen Fehler gemacht.
P.S.: Ohne Code kann hier vermutlich niemand so richtig was dazu sagen.
Caipi
-
#include<iostream>
#include<fstream>
#include<string>using namespace std;
int main()
{// Die Datei wl_zanare.txt wird geöffnet
std::ifstream Eingabedatei_zanare("wl_zanare_ausgabe.txt");
// Wenn die Datei erfolgreich geöffnet wurde
if (Eingabedatei_zanare)
{
cout << "Die Datei (wl_zanare_ausgabe.txt) wurde erfolgreich gelesen.\n";
}
// Wenn die Datei wl_zanare.txt nicht geöffnet werden, wird eine Fehler Meldung ausgegeben
if (!Eingabedatei_zanare)
{
cout << "Die Datei (wl_zanare_3,4x51.txt) kann nicht geoeffnet werden.\n";
cout << "Bitte ueberpruefen Sie ob sich die Datei im Verzeichnis befindet\n\n";
}// Wenn die Eingabedateizanare erfolgreich gelesen
// wurde, wird die Ausgabedatei erzeugt!
// Sie wird vom Benuzter benannt und endet
// automatisch mit der Endung .txtif(Eingabedatei_zanare)
{// Um die Ausgabedatei vom Programm aus zu bestimmen
// alt: Um bei Programmtests nicht jedesmal eine neue
// Ausgabedatei eingeben zu müssen nehmen Sie einfach
// das /* vor ***std::ofstream Ausgabe_fuer_beide_Programme("Ausgabetest.txt");***
// weg und setzen dafür vor ***std::string Dateiname;***
// ein /* und nach std::ofstream Ausgabe_fuer_beide_Pro
// gramme((Dateiname_Ausgabe+".txt").c_str());
// wieder ein */ zum beenden des Kommentar// std::ofstream Ausgabe_fuer_beide_Programme("Ausgabetest.txt");
// neu
// Um die Ausgabedatei vom Benutzer aus zu bestimmen mit der Endung .txtstd::string Dateiname_Ausgabe;
cout << "Bitte geben Sie einen Namen fuer Ihre Ausgabedatei ein:\t";
cin >> Dateiname_Ausgabe;std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str());
// Ausgabedatei erfolgreich erstellt
if(Ausgabe_fuer_beide_Programme)
{
cout << "Ausgabedatei erfolgreich erstellt.\n";
}
if(!Ausgabe_fuer_beide_Programme)
{
cout << "Ausgabedatei konnte nicht erstellt werden";
}// Jetzt werden die Zeilen für die Ausgabedatei definiert
// Zuerst muß die Funktion "Ausgabe_fuer_beide_Programme"
// aufgerufen werden. Dann der Inhalt der in der Ausgabe-
// datei stehen soll.// Inhalt der Datei Eingabedatei_zanare
char ch;
while (Eingabedatei_zanare.get(ch))
Ausgabe_fuer_beide_Programme << ch;// Schließen der Eingabedatei von Zanare
Eingabedatei_zanare.close();
}cout << " Die Dateiausgabe fuer beide Programme wird im Anhängemodus geöffnet";
std::string Dateiname_Ausgabe;
std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str(),ios::ate);
if (!Ausgabe_fuer_beide_Programme)
{
cout << "Es ist nicht möglich die Ausgabedatei für beide Programme zu öffnen";}
getchar();
return 0;}
-
bei ios::ate steht jetzt ios::ape, bewirkt aber keinen Unterschied
-
Du machst den ersten Ausgabestream nicht zu bevor du den zweiten oeffnest.
btw: 1. C/C++ Tags bei Quellcode verwenden, direkt unter dem Eingabefenster, macht das lesen einfacher
2.if(a){ ... } if(!a){ ... }
ist nicht wirklich effizient, lieber if(a)...else benutzen
-
vielen dank.
ok, das mit else ist ein guter tip.
aber wie und an welcher stelle schließe ich den stream denn? einfach über close haut das nicht hin.
-
std::string Dateiname_Ausgabe; if (Eingabedatei_zanare) { cout << "Die Datei (wl_zanare_ausgabe.txt) wurde erfolgreich gelesen.\n"; } else { cout << "Die Datei (wl_zanare_3,4x51.txt) kann nicht geoeffnet werden.\n"; cout << "Bitte ueberpruefen Sie ob sich die Datei im Verzeichnis befindet\n\n"; } ...snip... cout << "Bitte geben Sie einen Namen fuer Ihre Ausgabedatei ein:\t"; cin >> Dateiname_Ausgabe; std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str()); if(!Ausgabe_fuer_beide_Programme) { cout << "Ausgabedatei konnte nicht erstellt werden"; } else { cout << "Ausgabedatei erfolgreich erstellt.\n"; char ch; while (Eingabedatei_zanare.get(ch)) { Ausgabe_fuer_beide_Programme << ch; } Eingabedatei_zanare.close(); Ausgabe_fuer_beide_Programme.close(); } /* Hier noch ein Problem. Du hast oben den Dateinamen eingelesen und die * Variable dafuer innerhalb des if-Blocks deklariert, d.h. nach dem Block * ist die Variable weg. Hier erstellst du eine neue, "leere" Variable und * danach oeffnest du direkt die Datei. Daher sollte * "std::string Dateiname_Ausgabe;" moeglichst gleich am Anfang von der main() * stehen, dann gibts da keine Probleme. */ // std::string Dateiname_Ausgabe; std::ofstream Ausgabe_fuer_beide_Programme((Dateiname_Ausgabe+".txt").c_str(),ios::ate); if (!Ausgabe_fuer_beide_Programme) { cout << "Es ist nicht möglich die Ausgabedatei für beide Programme zu öffnen"; }
-
oh, danke. es lag daran das Dateiname_Ausgabe innerhalb der schleife deklariert war. Jetzt läuft es super. Vielen Dank nochmal!
gruss Sebastian