Pufferüberlauf, Namespaces und andere Katastrophen
Verfasst: Mi Okt 28, 2009 7:36 pm
Ich beiße mich immer noch fleißig (je nach Laune) durch mein Buch. Im Moment durch die Funktionen der C++ Standartbibliothek. Im Laufe dessen, habe ich folgenden Code verfasst, als Übung zu einem Kapitelende:
Es ist ein Programm zu Kopieren von Dateien, laut meinem Buch für Textdateien gedacht.
Erste Frage: Kann dieses Programm bedenkenlos jede Art von Dateien kopieren? Ich hab es mal versucht, bin mir aber über das Ergebnis nicht ganz sicher, der erster Eindruck war, dass es geht. Binärdateien bestehen ja eigentlich auch nur aus Zeichen.
Zweite Frage: Beim Öffnen der Dateien ist mir das "ios_base" ein bisschen suspekt. Das ist doch ein Namensraum oder etwa nicht? Als ich versucht habe es in die Namensräume einzutragen hat der Compiler gemeckert, ios_base wäre kein Namensraum. Versucht habe ich es so:
sowie so
Habe ich da einen Fehler gemacht, oder ist das wirklich kein Namensraum? Wenn nicht, was ist es dann?
3. Frage: Enthält die Funktion cin eine Feldgrenzenüberwachung? Wenn nicht, wie kann ich die Größe der Daten im Puffer überprüfen, bevor ich sie in eine Variable schreibe?
Hat cin eine Memberfunktion, mit der man die Größe des Puffers überprüfen kann, z. B. per sizeof?
Das war es fürs erste mal
Gruß Bebu
Code: Alles auswählen
//Präprozessor Includes
#include <iostream>
#include <string>
#include <fstream>
// Namespace Verwaltung
using namespace std; //Standartnamespace nutzen
// Globale Variablen
// Aufzählungen(enum)
// Strukturdefinitionen(struct)
// Klassendefinitionen(class)
// Funktionsdeklarationen
void leeren();
// Main Funktion
int main()
{
//Variablen und Klassen definieren
string dateiquelle;
string dateiziel;
ifstream dat_in;
ofstream dat_out;
char zeichen;
cout << "Geben Sie die Quelldatei ein: ";
cin >> dateiquelle;
leeren();
cout << "Geben Sie den Namen der Zieldatei ein: ";
cin >> dateiziel;
leeren();
//Öffnen von Quell- und Zieldatei
dat_in.open(dateiquelle.c_str(),ios_base::in);
dat_out.open(dateiziel.c_str(), ios_base::out);
//Abfragen ob Quelldatei geöffnet werden konnte
if (!dat_in)
{
cerr << "Datei konnte NICHT geöffnet werden!!\n";
return 1;
}
//Abfragen ob Zieldatei erzeugt werden konnte
if (!dat_out)
{
cerr << "Datei konnte NICHT erzeugt werden!!\n";
return 1;
}
//Zeichen für Zeichen kopieren
while (!dat_in.eof())
{
dat_in.get(zeichen);
dat_out << zeichen;
}
//Dateien schließen
dat_in.close();
dat_out.close();
return 0;
}
// Sonstige Funktionen(müssen unter Funtionsdeklarationen eingetragen werden)
//Funktion zum leeren des Puffers von cin
void leeren()
{
cin.clear();
while(cin.get() != '\n')
;
}
Erste Frage: Kann dieses Programm bedenkenlos jede Art von Dateien kopieren? Ich hab es mal versucht, bin mir aber über das Ergebnis nicht ganz sicher, der erster Eindruck war, dass es geht. Binärdateien bestehen ja eigentlich auch nur aus Zeichen.
Zweite Frage: Beim Öffnen der Dateien
Code: Alles auswählen
dat_in.open(dateiquelle.c_str(),ios_base::in);
Code: Alles auswählen
using namespace std, ios_base;
sowie so
Code: Alles auswählen
using namespace std;
using namespace ios_base;
3. Frage: Enthält die Funktion cin eine Feldgrenzenüberwachung? Wenn nicht, wie kann ich die Größe der Daten im Puffer überprüfen, bevor ich sie in eine Variable schreibe?
Hat cin eine Memberfunktion, mit der man die Größe des Puffers überprüfen kann, z. B. per sizeof?
Das war es fürs erste mal
Gruß Bebu