Brauche dringend Hilfe.
-
Ich habe folgenden Quellext:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;enum filetype {IN, OUT};
class Datei{
private:
string fname;
fstream file;
public:
Datei(string name, filetype ftype){
fname=name;
if(ftype==0){
file.open(name.c_str(), ios::in);
}else{
file.open(name.c_str(), ios::out);
}
}
int Datei::readNumbers(int n, int store[]){
string zahlen;
file >> zahlen;
cout << zahlen;
}
~Datei(){
file.close();
}
};int main(){
int n=5;
int x;
int *zahl=new int[n];
filetype type=IN;
string name="testfile_aufg_9_4.txt";
Datei::Datei(name, type);
Datei::Datei::readNumbers(n, zahl);
for(int i=0; i<n; i++){
cout << zahl[i] << endl;
}
delete[] zahl;
return 0;
}Und der Compiler gibt mir folgende Fehlermeldung aus:
cannot call member function `int Datei::readNumbers(int, int*)' without object
Woran liegt das?
Ich brauche schnell eine Antwort, da sie Aufgabe bis morgen fertig sein muss.
-
#include <iostream> #include <fstream> #include <string> using namespace std; enum filetype {IN, OUT}; class Datei{ private: string fname; fstream file; public: Datei(string name, filetype ftype){ fname=name; if(ftype==0){ file.open(name.c_str(), ios::in); }else{ file.open(name.c_str(), ios::out); } } int Datei::readNumbers(int n, int store[]){ string zahlen; file >> zahlen; cout << zahlen; } ~Datei(){ file.close(); } }; int main(){ int n=5; int x; int *zahl=new int[n]; filetype type=IN; string name="testfile_aufg_9_4.txt"; Datei::Datei(name, type); Datei::Datei::readNumbers(n, zahl); for(int i=0; i<n; i++){ cout << zahl[i] << endl; } delete[] zahl; return 0; }
-
liegtd as ab fstream?
wenn ja, den fstream kannste net so behandeln.
file >> zahlen. ist zwar supi aber wohin soll das gehen? DA ist kein objekt vorhandenversuche den fstream anders zu machen
einaml gibbet den
o(utput)fstream und den i(nput)streamofstream f("meine datei.txt");
f << "hallo";so musst du das machen.
und beim ifstreammusste natürlcih ne datei open("fdh.fasd"); erstmal öfnne

-
Das würde ich ja gerne machen, aber ich weiß beim programmieren noch nicht, ob die Datei später zum lesen oder zum schreiben genutzt wird.
-
also denkste auch das das am stream liegt?
aber nur so kannste den stream auch benutzen - SOWEIT ich weiß ^^ :roll: ich als der noob

-
Ich habe keine Ahnung, woran es liegt. Ich glaube mal, dass das mit fstream richtig ist, da das in der Aufgabe vorgegeben war, dass ich da ein fstream benutzen soll.
-
Datei::Datei(name, type); Datei::Datei::readNumbers(n, zahl);Habt ihr schon gelernt wie man von einer Klasse eine Instanz erzeugt und eine Methode darauf anwendet?
Datei datei(name, type); datei.readNumbers(n, zahl);
-
so gehts, ist aber nicht schön.
müsst ihr klassen benutzen ? ( damit hast du anscheinend noch leichte probleme
) ohne ginge es viel kuerzer...ich haette das oeffnen der datei lieber in die lese methode gestellt.
ausserdem hab ich noch eine public var fuer die anzahl der gelesenen zeichen definiert, sonst kriegst du beim auslesen des zahlen arrays speichermuell angezeigt.
tipp:
immer schoen fehler abfangen ( datei nicht vorhanden, array zu klein ) macht zwar etwas arbeit, erspart aber hinterher das dreifache an zeit fuer die fehlersuche...#include <iostream> #include <fstream> #include <string> using namespace std; enum filetype {IN, OUT}; class Datei{ private: string fname; fstream file; public: int anzahl; Datei(string name, filetype ftype){ anzahl=0; if(ftype==0){ file.open(name.c_str(), ios::in); if (!file.good()) { cout<<"datei "<<name<<" nicht da\n"; system("pause"); exit(1); } }else{ file.open(name.c_str(), ios::out); } } int Datei::readNumbers(int n, int store[]){ anzahl=0; while(!file.eof() ){ file >> store[anzahl]; cout << store[anzahl]<<", "; anzahl++; if (anzahl>=n){ cout<<"zahlen speicher zu klein\n"; system("pause"); exit(1); } } file.close(); cout<<endl; } ~Datei(){ cout<<" destruktor called "; } }; int main(){ int n=10; int x; int *zahl=new int[n]; filetype type=IN; string name="test.txt"; Datei Dat(name, type); Dat.readNumbers(n, zahl); cout<<"\ngelesen: \n"; for(int i=0; i<Dat.anzahl; i++){ cout << zahl[i] <<", "; } delete[] zahl; cout<<endl; system("pause"); return 0; }
-
@kermit1:
Danke, dass du dir so viel Arbeit gemacht hast, das alles zu schreiben, aber ich muss mich streng an die Aufgabenstellung halten.
Die Aufgabe lautet:
Definieren Sie eine Klasse Datei, die verwendet werden soll, um die Handhabung von tatsächlichen
Dateien einfacher zu machen. Um verschiedene Dateitypen unterscheiden zu können, definieren Sie
enum filetype {IN, OUT};
Die Klasse enthält:
1. Ein privates Feld fname für einen Dateinamen (verwenden Sie string).
2. Ein privates Feld file für einen Stream (Datentyp fstream).
3. Einen Konstruktor Datei(string name, filetype ftype). Nach dem Aufruf sollte fname die Zeichenkette aus name enthalten, und der Stream file sollte entweder zum Lesen (wenn ftype gleich IN ist) oder zum Schreiben (wenn ftype gleich OUT ist) offen sein. Hinweis: fstream.open muss mit char* aufgerufen werden.
4. Einen Destruktor. Stellen Sie sicher, dass kein Stream offen bleibt.Soweit funktioniert alles, aber hier ist die zweite Augabe:
Erweitern Sie Ihre Klasse um eine öffentliche Funktion
int Datei::readNumbers(int n, int store []);
die Zahlen aus dem Stream file liest, und diese in store speichert. Die Funktion soll alle Zahlen aus
dem Stream lesen, wenn es weniger als n sind, sonst die n ersten. Der Rückgabewert soll der Anzahl der
eingelesenen Zahlen entsprechen.
Hinweis: Sie können annehmen, dass die Datei nur Ganzzahlen, separiert von Leerzeichen, enthält.
Und damit habe ich Probleme.
-
Achja. Die Funktion an sich erzeugt keine Fehlermeldung, sondern der Aufruf der Funktion im main-Teil.
-
Meinen Beitrag gelesen?

-
@LordJaxom:
Oh. so klappt es. Würdest du mir bitte erklären, warum das so geht und nicht so, wie ich es gemacht habe? In der Uni habe ich es so gelernt, wie ich es gemacht habe.
-
Hallo,
ich versuchs mal zu erklären. MitDatei datei(parameter1, parameter2);wird eine Instanz der Klasse erzeugt, indem der Konstruktor deiner Klasse aufgerufen wird und ihm die Parameter parameter1 und parameter2 übergeben werden, d.h. du hast dann ein Objekt mit dem Namen datei vom Typ Datei (also dem Klassennamen). Auf dieses Objekt kannst du jetzt Memberfunktionen der Klasse anwenden. Zum Beispiel eben readNumbers dazu musst du dem Compiler natürlich mitteilen auf welches Objekt du die Funktion anwenden willst. Deshalb
datei.readnumbers(n, zahl);diese Funktion ruft jetzt readNumbers mit den Parametern n und zahl für die Instanz datei auf.
Hoffe ich konnte ein wenig helfen.
MfG
-
Danke. Das hat mir schon gut geholfen. Ich glaube, ich verstehe es jetzt.
-
Jetzt habe ich ein anderes Problem. Wie kann ich ein zweites mal auf datei zugreifen, nachdem ich es einmal mit "Datei datei(name, type);" aufgerufen habe? Mit "datei(name, type);" geht es nicht.
-
"datei" mit dem kleinen "d" ist ein Objekt Deiner Klasse Datei. Mit
Datei datei("name", type);legst Du das Objekt an. Damit existiert es, und Du kannst es nicht noch einmal anlegen. Du kannst ein zweites Objekt vom Typ Datei (das mit dem grossen "d" ist der Typ) anlegen, dann wird auch der Konstruktor ein zweites Mal aufgerufen:
Datei datei2("neuername", type);Das aber ist die Erzeugung, kein Zugriff. Ein Zugriff wäre z.B. der Aufruf der Methode
datei.readNumbers(n, zahl);. Und zwar ein Zugriff auf das Objekt datei (mit dem Dateinamen "name"). Mit
datei2.readNumbers(n, zahl);greifst Du auf das Objekt datei2 (mit dem Dateinamen "neuername") zu.
Also: "Datei" ist ein Typ. Eine Beschreibung des Inhalts und der Verhaltensweisen einer Datei. "datei" und "datei2" sind Objekte des Typs Datei, sie repräsentieren zwei echte Dateien auf der Festplatte. readNumbers ist eine Methode, die auf ein solches Objekt angewendet werden kann und aus dieser physikalischen Datei Daten in das Objekt lädt.
Datei::readNumbers(n, zahl); ist falsch weil kein Objekt existiert (der Compiler fragt sich "Ok, er möchte Zahlen aus einer Datei gelesen haben. Aber aus welcher Datei?")