Datei auf Dateiende prüfen
-
@jbaben Das Problem ist, dass nach dem lesen von c (Zeile 46) noch das '\n' in der Datei steht. Somit ist die Datei noch nicht zuende und
feof
noch nicht wahr.Dann werden alle Leseoperationen versucht, sind nicht erfolgreich und die alten Daten stehen noch in den Variablen.
Wenn du den ersten Lesebefehl in die Bedingung der
while
-Schleife nimmst, sollte es gehen:while(1 == fscanf(stream, "%2d", &i)) { // Read data back from file: // fscanf(stream, "%2d", &i);
Aber noch was Anderes: Das Zahlenliteral 65000 ist ein
int
(bei 16-Bit-Systemen einunsigned int
).
Du möchtest das beiprintf
alslong
übergeben.
Solange die Größe vonlong
undint
identisch ist, funktioniert das. Wenn nicht, gibt es undefined behavior, was so ziemlich Alles bewirken kann.
Mit 65000L wird aus dem Literal einlong
printf
undscanf
sind nicht typsicher, im Gegensatz zu den Stgreamoperatoren von C++.
-
Hallo,
-
der Hinweis von DirkB (while (1 == fscanf(stream, "%2d", &i)) hat in meinem Beispiel funktioniert.
-
DocShoe:
a. das gezeigte ist ja nur ein Beispiel
b. im eigentlichen Programm benutze ich natürlich eine Struktur für die Daten
c. da ich mein Programm in C++ programmieren möchte, werde ich mein Beispiel überarbeiten und den I/O stream verwenden -
Vielen Dank für Eure schnelle Hilfe, hat mich ersteinmal auf den richtigen Weg gebracht.
MfG
Juergen B.
-
-
@jbaben Es wäre sinnvoll, dass du verstehst, warum das (so) funktioniert.
-
@DirkB
Hallo,
ja das ist natürlich sinnvoll: "fscanf": Rückgabewert von 0 gibt an, dass keine Felder zugewiesen wurden.MfG
Juergen B.
-
@DocShoe
Hallo,
das gezeigte Beispiel von Dir funktioniert leider bei mir nicht (kompiliert mit C++ Visual_Studio 2022).
Die Daten werden nicht in der entsprechenden Datei gespeichert und somit auch nicht angezeigt.MfG
Juergen B.
-
Hast du denn auch die beiden
// to do: ...
ausprogrammiert?
-
@Th69
Hallo,
nein hatte ich nicht.
Aber wenn ich das auskommentiere (die beiden // entferne) erhalte ich die Meldung:
"E0020 Der Bezeichner "to" ist nicht definiert"MfG
Juergen B.
-
@jbaben https://www.duden.de/rechtschreibung/To_do
und (weil es einen Abschnitt Software gibt): https://de.wikipedia.org/wiki/To-do-Liste
-
Wir hatten damals jemanden, der in der Uni (2. Semester) in den Informatik-Hausaufgaben einen Quellcode mit Folgendem (sinngemäß) abgegeben hat:
// todo: hier musst du noch deinen Namen und deine Matrikelnummer eintragen
Derjenige bekam damals in der Vorlesung den "P2 Darwin-Award"
-
@DirkB
Hallo,das ist mir jetzt aber peinlich, das ich so falsch reagiert habe.
Natürlich weiss ich was eine To-Do-Liste ist, da muss ich wohl total geträumt haben.
Anderseits bin ich aber davon ausgegangen das Beispiel ist komplett.MfG
Juergen B.
-
Das Motto ist Hilfe zur Selbsthilfe. Man bekommt hier selten kompletten, lauffähigen Code, vielmehr soll der Fragesteller in die richtige Richtung geschubst werden und sich den Rest dann selbst erarbeiten. Durch Copy & Paste lernt man nix.
-
Hallo,
ja ist schon ok.
Hier das komplette Beispiel:#include <string> #include <iostream> #include <fstream> using namespace std; struct MyData { public: long LongData = 1; float FloatData = 2.3f; int IntegerData = 4; string StringData = "Test"; char CharData = '?'; MyData() = default; }; ostream& operator<<(ostream& os, MyData const& data) { // to do: Daten schreiben os << data.LongData << ",'" << data.FloatData << "','" << data.IntegerData << "','" << data.StringData << "'," << data.CharData << endl; return os; } istream& operator>>(istream& is, MyData& data) { // to do: Daten lesen is >> data.LongData >> data.FloatData >> data.IntegerData >> data.StringData >> data.CharData; return is; } void write_test(string const& filename) { MyData data; ofstream ofs; ofs.open(filename,ios::app); ofs << data; //ofs << data.LongData << endl; ofs.close(); } void read_test(string const& filename) { MyData data; ifstream ifs; ifs.open(filename,ios::in); ifs >> data; cout << data << endl; ifs.close(); } int main() { string const filename = "daten"; write_test(filename); read_test(filename); cout << "Eingabe erwartet"; cin.get(); }
MfG
Juergen B.
-
Das Einlesen paßt aber nicht 1:1 zu den geschriebenen Daten.
Initialisiere malMyData data
in Zeile 45 so:MyData data = { 0L, 0.f, 0, "", '*'};
Und lass dann das Programm laufen.
PS: Warum
ios:app
beim Schreiben der Datei?