Hinweis zur EA CPP104 (Probleme mit fstream)

Algorithmus, Baumdurchlauf, Compiler, Interpreter...; Cobol, Pascal, C/C++, Java & Co.
Antworten
Benutzeravatar
TheArchitect
Neues Mitglied
Neues Mitglied
Beiträge: 8
Registriert: 15.11.09 13:35
Wohnort: NRW (Germany)

Bei der Einsendeaufgabe 2 der Prüfungsaufgaben zur Lernenheit CPP104 muss folgendes unbedingt beachtet werden :

Da in der Aufgabenstellung die Lösung mittels eines Filestreams gefordert ist, welcher die Möglichkeit zum schreiben UND lesen bieten soll, muss hier die Klasse <fstream> benutzt werden.

Einige Kommilitonen könnten jedoch Schwierigkeiten haben die Aufgabe zu lösen, da mit den Angaben in der Lerneinheit eine Lösung nur bedingt möglich ist.

In der Lerneinheit steht auf Seite 36 :
"Ein und dieselbe Datei kann man hiermit zum Schreiben und Lesen einrichten : fstream file ("Demo.dat", ios::in | ios::out);"

Diese Aussage stimmt so nicht ganz. Dies funktioniert nämlich nur dann, wenn die Datei "Demo.dat" bereits vorhanden sein sollte. Falls die Datei nicht vorhanden sein sollte (was der Fall sein wird), wird mit dieser Anweisung KEINE Datei erzeugt.
Das Problem liegt hier an den gesetzten Flags der <ios>-Klasse.

Was in der Lernenheit nicht steht und auch in nur wenigen Lehrbüchern zu finden ist, ist die Tatsache dass es unabdingbar ist, bei "gleichzeitiger" Verwendung der Flags ios::in und ios::out unbedingt auch das Flag ios::trunc mit anzugeben !

Hier nun ein Musterbeispiel um die Aufgabe lösen zu können :

Code: Alles auswählen

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
  int index = 0;
  char zeichen[20] = "Das ist ein Test !";

  // Funktioniert NUR mit ios::trunc !!!
  fstream datei("Test.txt", ios::out | ios::in | ios::trunc);
  
  // Zeichen in Datei schreiben
  datei << zeichen;

  datei.seekg(0);
  // Zeichen aus Datei lesen und anzeigen
  while( datei && index < 20  )
  {
    datei.read( (char*) &zeichen[index], sizeof(char));
    cout << zeichen[index++];
  }

  datei.close();
  
  cout << endl; system("pause");
  return 0;
}
Wichtig ist hierbei die Verwendung des Flags ios::trunc.
Nochmals : Ohne dieses Flag wird KEINE Datei erzeugt !

Der in der Aufgabe darüberhinaus geforderte Algorithmus zur Erzeugung der Zeichenfolge und zur Änderung des Dateiinhaltes muss natürlich noch entsprechend implementiert werden ... dies dürfte jedoch nun keine Schwierigkeiten mehr darstellen oder ;-)
In function 'main()' : your code is suboptimal !
line1 : try the following operation: brain++
Antworten