[Help] C++ Dateioperationen

Justin-1992

Grünschnabel
Hi ich habe folgendes Problem:

Wenn ich das Programm öffne und starte funtkionert alles. Bis auf eine Kleinigkeit:

Es soll ein txt dokument kopieren und woanders einfügen..

z.B. ich habe ein txt Dokument in einem Ordner namens "lol" und die Datei heißt "lol2.txt" der Inhalt lautet "ich bin ein Text"
Der Inhalt soll kopiert werden von lol2.txt und eingefügt werden in den Ordner "Ziel" mit dem namen ziel.txt

Es klappt auch alles soweit.. nur das an dem Inhalt des zu kopierenden Textes ein y mit strichelchen dran gesetzt wird.


Beispiel: Beim 1. eingeben: C:\lol\lol2.txt
Beim 2. eingeben: C:\Ziel\ziel.txt

Erwartetet Ergebnis: In Ziel sollte "ich bin ein Text" stehen. Tuts abern icht sondern: "ich bin ein Text y"

Wodran liegt das?



Code:


Code:
#include <iostream> // einlesen der Befehle von iostream
#include <fstream> // einlesen der Befehle von fstream


using namespace std; // definieren des namespace


char dateiin[1024]; // benutzt für Problem Zwei
char dateiout[1024]; // benutzt für Problem Vier

int main () // Anfang des Programms


{ // start des Anweisungsblocks

cout << "Geben sie den Pfad der Datei die Sie Einlesen wollen an." << "\n\n" ;
cin >> dateiin;
cout << "Geben sie den Pfad an wohin die neue Datei gespeichert werden soll" << "\n\n";
cin >> dateiout;
cout << "Oeffnen der Datei:\t" << dateiin << "\n\n\n"; // Überschrift

ifstream in (dateiin); //Quell-Datei, Vorbereitung zum Auslesen
ofstream out (dateiout); // Ziel-Datei , Vorbereitung zum Einlesen

while (!in.eof()) // Liest Datei bis zum Dateiende ein

{ // Anfang Anweisungsblocks der Schleife
char ch; // Variablenzuweisung
ch=in.get(); // "get" liest jedes Zeichen ein egal ob Leerzeichen oder Zeilenumbruch
cout << ch; // gibt das eingelesene Zeichen wieder aus
out << ch; //
}


cout << "\n\n\n";
return 0; // Return
} // Ende des Programms


Mfg. JuSu
 
Wie ist denn die Bildschirm-Ausgabe? Das Programm sieht eigentlich soweit in Ordnung aus, aber da ich vorzugsweise in C programmiere muss ich immer umdenken...

Anmerkung: So viele Kommentare sind übertrieben in einem so Simplem C++-Programm. In einem Assembler-Programm, dass das Gleiche macht würde es schon anders aussehen. (das hätte vielleicht ein paar hundert Zeilen).
 
Zuletzt bearbeitet:
Da funktioniert alles. Glaube ich.. und das ist auch nciht so wichtig!

Das wichtige ist das er den Inhalt von lol.txt nach ziel.txt verschiebt!

Das macht er ja... nur er hänht ein y dran.
 
Ich habs ausprobiert, bei mir hängt er ein ? bei der Bildschirmausgabe an, und ein ^ bei Ziel.txt. Aber ich benutze auch einen Mac. Da hatte ich schon bei manchen Programmen Unterschiede zu den Windows-varianten
 
Ich weiss es nicht...

Ich habe das Ganz mal in C geschrieben, und es klappt!

Code:
#include <stdio.h>

main()
{
 FILE *in, *out;
 char inName[1024], outName[1024];

 printf("Source-Datei eingeben: ");
 scanf("%s", inName);
 printf("Ziel-Datei eingeben: ");
 scanf("%s", outName);


 in = fopen(inName, "r");
 out = fopen(outName, "w"); 

 printf("Inhalt der Datei: ");
 while (!feof(in))
 {
  char buffer[1024];
  fscanf(in, "%s", buffer);
  printf("%s ", buffer);
  fprintf(out, "%s", buffer);
 }
 printf("\n");
 fclose(in);
 fclose(out);

 return 0;
}

Da sieht man doch, dass C besser ist als C + 1. War ein kleiner Witz;)
 
Code:
while (!in.eof()) // Liest Datei bis zum Dateiende ein

{ // Anfang Anweisungsblocks der Schleife
char ch; // Variablenzuweisung
ch=in.get(); // "get" liest jedes Zeichen ein egal ob Leerzeichen oder Zeilenumbruch
cout << ch; // gibt das eingelesene Zeichen wieder aus
out << ch; //
}
Das eof-Bit wird erst gesetzt, wenn versucht wurde, über das Dateiende hinaus zu lesen. Das passiert beim letzten Aufruf von get(). Dieser schlägt fehl, aber du gibst trotzdem noch ein Zeichen aus, das zu diesem Zeitpunkt einen Fehlercode enthält. Darum dieses komische Zeichen.

Verwende am besten die Überladung „istream& get ( char& c );“ in dieser Weise:
C++:
char ch;
while (in.get(ch)) // Liest Datei bis zum Dateiende ein

{ // Anfang Anweisungsblocks der Schleife
cout << ch; // gibt das eingelesene Zeichen wieder aus
out << ch; //
}
Damit behandelst du auch gleich sämtliche Fehlerfälle und nicht bloß eof.

Übrigens: wenn man den Code in einem Anweisungsblock gegenüber dem umliegenden Code einrückt, verbessert sich die Lesbarkeit enorm.

Grüße,
Matthias
 
Das leuchtet ein! Darauf wäre ich nicht gekommen! Hätte ich aber auch nicht gebraucht ;)

In C ist es ja so dass feof() bis zum Ende, und kein Zeichen weiter liest. Darum ist mir das nicht aufgefallen...
 
Zurück